diff --git a/src/API/getAchievements.test.ts b/src/API/getAchievements.test.ts index 08f92d63..52fa4195 100644 --- a/src/API/getAchievements.test.ts +++ b/src/API/getAchievements.test.ts @@ -88,7 +88,7 @@ test('getAchievements', async () => { expectTypeOf(tier.tier).toEqualTypeOf(); expect(tier.points).toBeDefined(); expect(tier.points).toBeGreaterThanOrEqual(0); - expectTypeOf(tier.points).toEqualTypeOf(); + expectTypeOf(tier.points).toEqualTypeOf(); expect(tier.amount).toBeDefined(); expect(tier.amount).toBeGreaterThanOrEqual(0); expectTypeOf(tier.amount).toEqualTypeOf(); diff --git a/src/API/getPlayer.test.ts b/src/API/getPlayer.test.ts index 01d989cb..a860c339 100644 --- a/src/API/getPlayer.test.ts +++ b/src/API/getPlayer.test.ts @@ -1,38 +1,49 @@ +import Achievements from '../structures/Player/Achievements'; import Arcade from '../structures/MiniGames/Arcade'; import ArenaBrawl from '../structures/MiniGames/ArenaBrawl'; import BedWars from '../structures/MiniGames/BedWars'; import BlitzSurvivalGames from '../structures/MiniGames/BlitzSurvivalGames'; import BuildBattle from '../structures/MiniGames/BuildBattle'; import Client from '../Client'; -import Color, { ColorCode, ColorHex, ColorString, InGameCode } from '../structures/Color'; +import Color from '../structures/Color'; import CopsAndCrims from '../structures/MiniGames/CopsAndCrims'; +import Cosmetics from '../structures/Player/Cosmetics'; import Duels from '../structures/MiniGames/Duels'; +import Gifting from '../structures/Player/Gifting'; import Guild from '../structures/Guild/Guild'; import House from '../structures/House'; +import Housing from '../structures/Housing'; import MegaWalls from '../structures/MiniGames/MegaWalls'; import MurderMystery from '../structures/MiniGames/MurderMystery'; import Paintball from '../structures/MiniGames/Paintball'; +import Parkour from '../structures/Player/Parkour'; import Pit from '../structures/MiniGames/Pit'; -import Player, { - LevelProgress, - PlayerRank, - PlayerSocialMedia, - PlayerStats, - RanksPurchaseTime -} from '../structures/Player'; -import PlayerCosmetics from '../structures/PlayerCosmetics'; +import Player from '../structures/Player/Player'; import Quakecraft from '../structures/MiniGames/Quakecraft'; +import Quests from '../structures/Player/Quests'; import RecentGame from '../structures/RecentGame'; +import Rewards from '../structures/Player/Rewards'; +import Seasonal from '../structures/Player/Seasonal'; import SkyWars from '../structures/MiniGames/SkyWars'; import SmashHeroes from '../structures/MiniGames/SmashHeroes'; +import SocialMedia from '../structures/Player/SocialMedia'; import SpeedUHC from '../structures/MiniGames/SpeedUHC'; import TNTGames from '../structures/MiniGames/TNTGames'; +import Tourney from '../structures/Player/Tourney'; import TurboKartRacers from '../structures/MiniGames/TurboKartRacers'; import UHC from '../structures/MiniGames/UHC'; import VampireZ from '../structures/MiniGames/VampireZ'; import Walls from '../structures/MiniGames/Walls'; import Warlords from '../structures/MiniGames/Warlords'; import WoolGames from '../structures/MiniGames/WoolGames'; +import { + ChatChannel, + Language, + LevelProgress, + PlayerRank, + PlayerStats, + ScorpiusBribe +} from '../structures/Player/Types'; import { RequestData } from '../Private/RequestHandler'; import { defaultRequestData } from '../../vitest.setup'; import { expect, expectTypeOf, test, vi } from 'vitest'; @@ -72,11 +83,143 @@ 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(); - expectTypeOf(data.guild).toEqualTypeOf(); 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.arena).toBeDefined(); + expect(data.stats.arena).toBeInstanceOf(ArenaBrawl); + expectTypeOf(data.stats.arena).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(); }); @@ -84,9 +227,73 @@ 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) => { @@ -95,6 +302,77 @@ test('getPlayer (houses)', async () => { 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.arena).toBeDefined(); + expect(data.stats.arena).toBeInstanceOf(ArenaBrawl); + expectTypeOf(data.stats.arena).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(); }); @@ -102,8 +380,72 @@ 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) { @@ -113,6 +455,74 @@ test('getPlayer (recent games)', async () => { 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.arena).toBeDefined(); + expect(data.stats.arena).toBeInstanceOf(ArenaBrawl); + expectTypeOf(data.stats.arena).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(); }); @@ -123,210 +533,139 @@ test('getPlayer', async () => { expect(data).toBeInstanceOf(Player); expectTypeOf(data).toEqualTypeOf(); data = data as Player; - expect(data.nickname).toBeDefined(); - expectTypeOf(data.nickname).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.guild).toBeDefined(); - expectTypeOf(data.guild).toEqualTypeOf(); - expect(data.channel).toBeDefined(); - expectTypeOf(data.channel).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(); - expectTypeOf(data.firstLoginTimestamp).toEqualTypeOf(); - expect(data.firstLogin).toBeDefined(); - expectTypeOf(data.firstLogin).toEqualTypeOf(); + 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.lastLogin).toBeDefined(); - expectTypeOf(data.lastLogin).toEqualTypeOf(); - expect(data.lastLogoutTimestamp).toBeDefined(); - expectTypeOf(data.lastLogoutTimestamp).toEqualTypeOf(); - expect(data.lastLogout).toBeDefined(); - expectTypeOf(data.lastLogout).toEqualTypeOf(); - expect(data.plusColor).toBeDefined(); - expectTypeOf(data.plusColor).toEqualTypeOf(); - if (data.plusColor) { - expect(data.plusColor).toBeDefined(); - expectTypeOf(data.plusColor).toEqualTypeOf(); - expect(data.plusColor.color).toBeDefined(); - expectTypeOf(data.plusColor.color).toEqualTypeOf(); - expect(data.plusColor.toString).toBeDefined(); - expectTypeOf(data.plusColor.toString).toEqualTypeOf<() => ColorString>(); - expect(data.plusColor.toString()).toBeDefined(); - expectTypeOf(data.plusColor.toString()).toEqualTypeOf(); - expect(data.plusColor.toHex).toBeDefined(); - expectTypeOf(data.plusColor.toHex).toEqualTypeOf<() => ColorHex>(); - expect(data.plusColor.toHex()).toBeDefined(); - expectTypeOf(data.plusColor.toHex()).toEqualTypeOf(); - expect(data.plusColor.toCode).toBeDefined(); - expectTypeOf(data.plusColor.toCode).toEqualTypeOf<() => ColorCode>(); - expect(data.plusColor.toCode()).toBeDefined(); - expectTypeOf(data.plusColor.toCode()).toEqualTypeOf(); - expect(data.plusColor.toInGameCode).toBeDefined(); - expectTypeOf(data.plusColor.toInGameCode).toEqualTypeOf<() => InGameCode>(); - expect(data.plusColor.toInGameCode()).toBeDefined(); - expectTypeOf(data.plusColor.toInGameCode()).toEqualTypeOf(); - } - expect(data.prefixColor).toBeDefined(); - expectTypeOf(data.prefixColor).toEqualTypeOf(); - if (data.prefixColor) { - expect(data.prefixColor).toBeDefined(); - expectTypeOf(data.prefixColor).toEqualTypeOf(); - expect(data.prefixColor.color).toBeDefined(); - expectTypeOf(data.prefixColor.color).toEqualTypeOf(); - expect(data.prefixColor.toString).toBeDefined(); - expectTypeOf(data.prefixColor.toString).toEqualTypeOf<() => ColorString>(); - expect(data.prefixColor.toString()).toBeDefined(); - expectTypeOf(data.prefixColor.toString()).toEqualTypeOf(); - expect(data.prefixColor.toHex).toBeDefined(); - expectTypeOf(data.prefixColor.toHex).toEqualTypeOf<() => ColorHex>(); - expect(data.prefixColor.toHex()).toBeDefined(); - expectTypeOf(data.prefixColor.toHex()).toEqualTypeOf(); - expect(data.prefixColor.toCode).toBeDefined(); - expectTypeOf(data.prefixColor.toCode).toEqualTypeOf<() => ColorCode>(); - expect(data.prefixColor.toCode()).toBeDefined(); - expectTypeOf(data.prefixColor.toCode()).toEqualTypeOf(); - expect(data.prefixColor.toInGameCode).toBeDefined(); - expectTypeOf(data.prefixColor.toInGameCode).toEqualTypeOf<() => InGameCode>(); - expect(data.prefixColor.toInGameCode()).toBeDefined(); - expectTypeOf(data.prefixColor.toInGameCode()).toEqualTypeOf(); - } - expect(data.karma).toBeDefined(); - expectTypeOf(data.karma).toEqualTypeOf(); + expect(data.lastLoginAt).toBeDefined(); + expectTypeOf(data.lastLoginAt).toEqualTypeOf(); expect(data.achievements).toBeDefined(); - expectTypeOf(data.achievements).toEqualTypeOf(); - expect(data.achievementPoints).toBeDefined(); - expectTypeOf(data.achievementPoints).toEqualTypeOf(); - expect(data.totalExperience).toBeDefined(); - expectTypeOf(data.totalExperience).toEqualTypeOf(); + 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.socialMedia).toBeDefined(); - expectTypeOf(data.socialMedia).toEqualTypeOf(); - expect(data.giftBundlesSent).toBeDefined(); - expectTypeOf(data.giftBundlesSent).toEqualTypeOf(); - expect(data.giftBundlesReceived).toBeDefined(); - expectTypeOf(data.giftBundlesReceived).toEqualTypeOf(); - expect(data.giftsSent).toBeDefined(); - expectTypeOf(data.giftsSent).toEqualTypeOf(); - expect(data.isOnline).toBeDefined(); - expectTypeOf(data.isOnline).toEqualTypeOf(); - expect(data.lastDailyReward).toBeDefined(); - expectTypeOf(data.lastDailyReward).toEqualTypeOf(); - expect(data.lastDailyRewardTimestamp).toBeDefined(); - expectTypeOf(data.lastDailyRewardTimestamp).toEqualTypeOf(); - expect(data.totalRewards).toBeDefined(); - expectTypeOf(data.totalRewards).toEqualTypeOf(); - expect(data.totalDailyRewards).toBeDefined(); - expectTypeOf(data.totalDailyRewards).toEqualTypeOf(); - expect(data.rewardStreak).toBeDefined(); - expectTypeOf(data.rewardStreak).toEqualTypeOf(); - expect(data.rewardScore).toBeDefined(); - expectTypeOf(data.rewardScore).toEqualTypeOf(); - expect(data.rewardHighScore).toBeDefined(); - expectTypeOf(data.rewardHighScore).toEqualTypeOf(); - expect(data.levelProgress).toBeDefined(); - expectTypeOf(data.levelProgress).toEqualTypeOf(); + 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).instanceOf(Arcade); + expect(data.stats.arcade).toBeInstanceOf(Arcade); expectTypeOf(data.stats.arcade).toEqualTypeOf(); - expect(data.stats.arena).toBeDefined(); - expect(data.stats.arena).instanceOf(ArenaBrawl); + expect(data.stats.arena).toBeInstanceOf(ArenaBrawl); expectTypeOf(data.stats.arena).toEqualTypeOf(); - expect(data.stats.bedwars).toBeDefined(); - expect(data.stats.bedwars).instanceOf(BedWars); + expect(data.stats.bedwars).toBeInstanceOf(BedWars); expectTypeOf(data.stats.bedwars).toEqualTypeOf(); - expect(data.stats.blitzsg).toBeDefined(); - expect(data.stats.blitzsg).instanceOf(BlitzSurvivalGames); + expect(data.stats.blitzsg).toBeInstanceOf(BlitzSurvivalGames); expectTypeOf(data.stats.blitzsg).toEqualTypeOf(); - expect(data.stats.buildbattle).toBeDefined(); - expect(data.stats.buildbattle).instanceOf(BuildBattle); + expect(data.stats.buildbattle).toBeInstanceOf(BuildBattle); expectTypeOf(data.stats.buildbattle).toEqualTypeOf(); - expect(data.stats.copsandcrims).toBeDefined(); - expect(data.stats.copsandcrims).instanceOf(CopsAndCrims); + expect(data.stats.copsandcrims).toBeInstanceOf(CopsAndCrims); expectTypeOf(data.stats.copsandcrims).toEqualTypeOf(); - expect(data.stats.duels).toBeDefined(); - expect(data.stats.duels).instanceOf(Duels); + expect(data.stats.duels).toBeInstanceOf(Duels); expectTypeOf(data.stats.duels).toEqualTypeOf(); - expect(data.stats.megawalls).toBeDefined(); - expect(data.stats.megawalls).instanceOf(MegaWalls); + expect(data.stats.megawalls).toBeInstanceOf(MegaWalls); expectTypeOf(data.stats.megawalls).toEqualTypeOf(); - expect(data.stats.murdermystery).toBeDefined(); - expect(data.stats.murdermystery).instanceOf(MurderMystery); + expect(data.stats.murdermystery).toBeInstanceOf(MurderMystery); expectTypeOf(data.stats.murdermystery).toEqualTypeOf(); - expect(data.stats.paintball).toBeDefined(); - expect(data.stats.paintball).instanceOf(Paintball); + expect(data.stats.paintball).toBeInstanceOf(Paintball); expectTypeOf(data.stats.paintball).toEqualTypeOf(); - expect(data.stats.pit).toBeDefined(); - expect(data.stats.pit).instanceOf(Pit); + expect(data.stats.pit).toBeInstanceOf(Pit); expectTypeOf(data.stats.pit).toEqualTypeOf(); - expect(data.stats.quakecraft).toBeDefined(); - expect(data.stats.quakecraft).instanceOf(Quakecraft); + expect(data.stats.quakecraft).toBeInstanceOf(Quakecraft); expectTypeOf(data.stats.quakecraft).toEqualTypeOf(); - expect(data.stats.skywars).toBeDefined(); - expect(data.stats.skywars).instanceOf(SkyWars); + expect(data.stats.skywars).toBeInstanceOf(SkyWars); expectTypeOf(data.stats.skywars).toEqualTypeOf(); - expect(data.stats.smashheroes).toBeDefined(); - expect(data.stats.smashheroes).instanceOf(SmashHeroes); + expect(data.stats.smashheroes).toBeInstanceOf(SmashHeroes); expectTypeOf(data.stats.smashheroes).toEqualTypeOf(); - expect(data.stats.speeduhc).toBeDefined(); - expect(data.stats.speeduhc).instanceOf(SpeedUHC); + expect(data.stats.speeduhc).toBeInstanceOf(SpeedUHC); expectTypeOf(data.stats.speeduhc).toEqualTypeOf(); - expect(data.stats.tntgames).toBeDefined(); - expect(data.stats.tntgames).instanceOf(TNTGames); + expect(data.stats.tntgames).toBeInstanceOf(TNTGames); expectTypeOf(data.stats.tntgames).toEqualTypeOf(); - expect(data.stats.turbokartracers).toBeDefined(); - expect(data.stats.turbokartracers).instanceOf(TurboKartRacers); + expect(data.stats.turbokartracers).toBeInstanceOf(TurboKartRacers); expectTypeOf(data.stats.turbokartracers).toEqualTypeOf(); - expect(data.stats.uhc).toBeDefined(); - expect(data.stats.uhc).instanceOf(UHC); + expect(data.stats.uhc).toBeInstanceOf(UHC); expectTypeOf(data.stats.uhc).toEqualTypeOf(); - expect(data.stats.vampirez).toBeDefined(); - expect(data.stats.vampirez).instanceOf(VampireZ); + expect(data.stats.vampirez).toBeInstanceOf(VampireZ); expectTypeOf(data.stats.vampirez).toEqualTypeOf(); - expect(data.stats.walls).toBeDefined(); - expect(data.stats.walls).instanceOf(Walls); + expect(data.stats.walls).toBeInstanceOf(Walls); expectTypeOf(data.stats.walls).toEqualTypeOf(); - expect(data.stats.warlords).toBeDefined(); - expect(data.stats.warlords).instanceOf(Warlords); + 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.userLanguage).toBeDefined(); - expectTypeOf(data.userLanguage).toEqualTypeOf(); - expect(data.claimedLevelingRewards).toBeDefined(); - expectTypeOf(data.claimedLevelingRewards).toEqualTypeOf(); - expect(data.globalCosmetics).toBeDefined(); - expectTypeOf(data.globalCosmetics).toEqualTypeOf(); - expect(data.ranksPurchaseTime).toBeDefined(); - expectTypeOf(data.ranksPurchaseTime).toEqualTypeOf(); client.destroy(); }); diff --git a/src/API/getPlayer.ts b/src/API/getPlayer.ts index 71827128..7500987d 100644 --- a/src/API/getPlayer.ts +++ b/src/API/getPlayer.ts @@ -2,7 +2,7 @@ import Client from '../Client'; import Endpoint from '../Private/Endpoint'; import Guild from '../structures/Guild/Guild'; import House from '../structures/House'; -import Player from '../structures/Player'; +import Player from '../structures/Player/Player'; import RecentGame from '../structures/RecentGame'; import { PlayerRequestOptions } from './API'; import { RequestData } from '../Private/RequestHandler'; diff --git a/src/Client.ts b/src/Client.ts index fbacf7ba..bf90fca2 100644 --- a/src/Client.ts +++ b/src/Client.ts @@ -13,7 +13,7 @@ import Guild from './structures/Guild/Guild'; import GuildAchievements from './structures/Static/Achievements/Guild'; import House from './structures/House'; import Leaderboard from './structures/Leaderboard'; -import Player from './structures/Player'; +import Player from './structures/Player/Player'; import Product from './structures/SkyBlock/Bazaar/Product'; import Quests from './structures/Static/Quests'; import RateLimit from './Private/RateLimit'; diff --git a/src/index.ts b/src/index.ts index 925e2e29..1b0f6b3c 100644 --- a/src/index.ts +++ b/src/index.ts @@ -66,10 +66,10 @@ export * from './structures/MiniGames/VampireZ'; export * from './structures/MiniGames/Walls'; export * from './structures/MiniGames/Warlords'; export * from './structures/MiniGames/WoolGames'; -export * from './structures/Pet'; -export * from './structures/Pets'; -export * from './structures/Player'; -export * from './structures/PlayerCosmetics'; +export * from './structures/Player/Pet'; +export * from './structures/Player/Pets'; +export * from './structures/Player/Player'; +export * from './structures/Player/Cosmetics'; export * from './structures/RecentGame'; export * from './structures/SkyBlock/Auctions/Auction'; export * from './structures/SkyBlock/Auctions/AuctionInfo'; @@ -107,7 +107,7 @@ export * from './structures/WatchdogStats'; export * from './utils/Constants'; export * from './utils/Guild'; -export * from './utils/Player'; +export * from './structures/Player/Utils'; export * from './utils/SkyblockUtils'; export * from './utils/divide'; export * from './utils/isGuildID'; diff --git a/src/structures/Housing.ts b/src/structures/Housing.ts new file mode 100644 index 00000000..758dd8e8 --- /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/MiniGames/Pit.test.ts b/src/structures/MiniGames/Pit.test.ts index 47fc9ab4..60731d97 100644 --- a/src/structures/MiniGames/Pit.test.ts +++ b/src/structures/MiniGames/Pit.test.ts @@ -1,7 +1,7 @@ import Client from '../../Client'; import Pit, { PitArmor } from './Pit'; import PitInventoryItem from './PitInventoryItem'; -import Player from '../Player'; +import Player from '../Player/Player'; import { expect, expectTypeOf, test } from 'vitest'; test('Pit', () => { diff --git a/src/structures/Pets.ts b/src/structures/Pets.ts deleted file mode 100644 index 867ee185..00000000 --- a/src/structures/Pets.ts +++ /dev/null @@ -1,46 +0,0 @@ -import Pet from './Pet'; - -export interface 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 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 = data.petConsumables; - } -} - -export default Pets; diff --git a/src/structures/Player.test.ts b/src/structures/Player.test.ts deleted file mode 100644 index 6c592fd8..00000000 --- a/src/structures/Player.test.ts +++ /dev/null @@ -1,102 +0,0 @@ -import Color from './Color'; -import Guild from './Guild/Guild'; -import House from './House'; -import Player, { LevelProgress, PlayerRank, PlayerSocialMedia, PlayerStats, RanksPurchaseTime } from './Player'; -import PlayerCosmetics from './PlayerCosmetics'; -import RecentGame from './RecentGame'; -import { expect, expectTypeOf, test } from 'vitest'; - -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(); - expectTypeOf(data.rank).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.channel).toBeDefined(); - expectTypeOf(data.channel).toEqualTypeOf(); - expect(data.firstLoginTimestamp).toBeDefined(); - expectTypeOf(data.firstLoginTimestamp).toEqualTypeOf(); - expect(data.firstLogin).toBeDefined(); - expectTypeOf(data.firstLogin).toEqualTypeOf(); - expect(data.lastLoginTimestamp).toBeDefined(); - expectTypeOf(data.lastLoginTimestamp).toEqualTypeOf(); - expect(data.lastLogin).toBeDefined(); - expectTypeOf(data.lastLogin).toEqualTypeOf(); - expect(data.lastLogoutTimestamp).toBeDefined(); - expectTypeOf(data.lastLogoutTimestamp).toEqualTypeOf(); - expect(data.lastLogout).toBeDefined(); - expectTypeOf(data.lastLogout).toEqualTypeOf(); - expect(data.plusColor).toBeDefined(); - expectTypeOf(data.plusColor).toEqualTypeOf(); - expect(data.prefixColor).toBeDefined(); - expectTypeOf(data.prefixColor).toEqualTypeOf(); - expect(data.karma).toBeDefined(); - expect(data.karma).toBeGreaterThanOrEqual(0); - expectTypeOf(data.karma).toEqualTypeOf(); - expect(data.achievements).toBeDefined(); - expectTypeOf(data.achievements).toEqualTypeOf(); - expect(data.achievementPoints).toBeDefined(); - expect(data.achievementPoints).toBeGreaterThanOrEqual(0); - expectTypeOf(data.achievementPoints).toEqualTypeOf(); - expect(data.totalExperience).toBeDefined(); - expect(data.totalExperience).toBeGreaterThanOrEqual(0); - expectTypeOf(data.totalExperience).toEqualTypeOf(); - expect(data.level).toBeDefined(); - expect(data.level).toBeGreaterThanOrEqual(0); - expectTypeOf(data.level).toEqualTypeOf(); - expect(data.socialMedia).toBeDefined(); - expectTypeOf(data.socialMedia).toEqualTypeOf(); - expect(data.giftBundlesSent).toBeDefined(); - expect(data.giftBundlesSent).toBeGreaterThanOrEqual(0); - expectTypeOf(data.giftBundlesSent).toEqualTypeOf(); - expect(data.giftBundlesReceived).toBeDefined(); - expect(data.giftBundlesReceived).toBeGreaterThanOrEqual(0); - expectTypeOf(data.giftBundlesReceived).toEqualTypeOf(); - expect(data.giftsSent).toBeDefined(); - expect(data.giftsSent).toBeGreaterThanOrEqual(0); - expectTypeOf(data.giftsSent).toEqualTypeOf(); - expect(data.isOnline).toBeDefined(); - expectTypeOf(data.isOnline).toEqualTypeOf(); - expect(data.lastDailyRewardTimestamp).toBeDefined(); - expectTypeOf(data.lastDailyRewardTimestamp).toEqualTypeOf(); - expect(data.lastDailyReward).toBeDefined(); - expectTypeOf(data.lastDailyReward).toEqualTypeOf(); - expect(data.totalRewards).toBeDefined(); - expect(data.totalRewards).toBeGreaterThanOrEqual(0); - expectTypeOf(data.totalRewards).toEqualTypeOf(); - expect(data.totalDailyRewards).toBeDefined(); - expect(data.totalDailyRewards).toBeGreaterThanOrEqual(0); - expectTypeOf(data.totalDailyRewards).toEqualTypeOf(); - expect(data.rewardStreak).toBeDefined(); - expect(data.rewardStreak).toBeGreaterThanOrEqual(0); - expectTypeOf(data.rewardStreak).toEqualTypeOf(); - expect(data.rewardScore).toBeDefined(); - expect(data.rewardScore).toBeGreaterThanOrEqual(0); - expectTypeOf(data.rewardScore).toEqualTypeOf(); - expect(data.rewardHighScore).toBeDefined(); - expect(data.rewardHighScore).toBeGreaterThanOrEqual(0); - expectTypeOf(data.rewardHighScore).toEqualTypeOf(); - expect(data.levelProgress).toBeDefined(); - expectTypeOf(data.levelProgress).toEqualTypeOf(); - expect(data.stats).toBeDefined(); - expectTypeOf(data.stats).toEqualTypeOf(); - expect(data.userLanguage).toBeDefined(); - expectTypeOf(data.userLanguage).toEqualTypeOf(); - expect(data.claimedLevelingRewards).toBeDefined(); - expectTypeOf(data.claimedLevelingRewards).toEqualTypeOf(); - expect(data.globalCosmetics).toBeDefined(); - expectTypeOf(data.globalCosmetics).toEqualTypeOf(); - expect(data.ranksPurchaseTime).toBeDefined(); - expectTypeOf(data.ranksPurchaseTime).toEqualTypeOf(); -}); diff --git a/src/structures/Player.ts b/src/structures/Player.ts deleted file mode 100644 index d9422354..00000000 --- a/src/structures/Player.ts +++ /dev/null @@ -1,228 +0,0 @@ -import Arcade from './MiniGames/Arcade'; -import ArenaBrawl from './MiniGames/ArenaBrawl'; -import BedWars from './MiniGames/BedWars'; -import BlitzSurvivalGames from './MiniGames/BlitzSurvivalGames'; -import BuildBattle from './MiniGames/BuildBattle'; -import Color from './Color'; -import CopsAndCrims from './MiniGames/CopsAndCrims'; -import Duels from './MiniGames/Duels'; -import Guild from './Guild/Guild'; -import House from './House'; -import MegaWalls from './MiniGames/MegaWalls'; -import MurderMystery from './MiniGames/MurderMystery'; -import Paintball from './MiniGames/Paintball'; -import Pit from './MiniGames/Pit'; -import PlayerCosmetics from './PlayerCosmetics'; -import Quakecraft from './MiniGames/Quakecraft'; -import RecentGame from './RecentGame'; -import SkyWars from './MiniGames/SkyWars'; -import SmashHeroes from './MiniGames/SmashHeroes'; -import SpeedUHC from './MiniGames/SpeedUHC'; -import TNTGames from './MiniGames/TNTGames'; -import TurboKartRacers from './MiniGames/TurboKartRacers'; -import UHC from './MiniGames/UHC'; -import VampireZ from './MiniGames/VampireZ'; -import Walls from './MiniGames/Walls'; -import Warlords from './MiniGames/Warlords'; -import WoolGames from './MiniGames/WoolGames'; -import { getPlayerLevel, getRank, getSocialMedia, parseClaimedRewards, playerLevelProgress } from '../utils/Player'; -import { recursive } from '../utils/removeSnakeCase'; - -export interface LevelProgress { - xpToNext: number; - remainingXP: number; - currentXP: number; - percent: number; - percentRemaining: number; -} - -export interface PlayerSocialMedia { - name: string; - link: string; - id: string; -} - -export interface PlayerStats { - arcade: Arcade; - arena: 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 = - | 'Default' - | '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; -} - -class Player { - nickname: string; - uuid: string; - rank: PlayerRank; - guild: Guild | null; - houses: House[] | null; - recentGames: RecentGame[] | null; - channel: string; - firstLoginTimestamp: number | null; - firstLogin: Date | null; - lastLoginTimestamp: number | null; - lastLogin: Date | null; - lastLogoutTimestamp: number | null; - lastLogout: Date | null; - plusColor: Color | null; - prefixColor: Color | null; - karma: number; - achievements: object; - achievementPoints: number; - totalExperience: number; - level: number; - socialMedia: PlayerSocialMedia[]; - giftBundlesSent: number; - giftBundlesReceived: number; - giftsSent: number; - isOnline: boolean; - lastDailyRewardTimestamp: number | null; - lastDailyReward: Date | null; - totalRewards: number; - totalDailyRewards: number; - rewardStreak: number; - rewardScore: number; - rewardHighScore: number; - levelProgress: LevelProgress; - stats: PlayerStats; - userLanguage: string; - claimedLevelingRewards: number[]; - globalCosmetics: PlayerCosmetics | null; - ranksPurchaseTime: RanksPurchaseTime; - - constructor( - data: Record, - extra: { guild: Guild | null; houses: House[] | null; recentGames: RecentGame[] | null } - ) { - this.nickname = data?.displayname || ''; - this.uuid = data?.uuid || ''; - this.rank = getRank(data); - this.guild = extra?.guild; - this.houses = extra?.houses; - this.recentGames = extra?.recentGames; - this.channel = data?.channel || 'ALL'; - this.firstLoginTimestamp = data?.firstLogin || null; - this.firstLogin = data?.firstLogin ? new Date(data?.firstLogin) : null; - this.lastLoginTimestamp = data?.lastLogin || null; - this.lastLogin = data?.lastLogin ? new Date(data?.lastLogin) : null; - this.lastLogoutTimestamp = data?.lastLogout || null; - this.lastLogout = data?.lastLogout ? new Date(data?.lastLogout) : null; - this.plusColor = - 'MVP+' === this.rank || 'MVP++' === this.rank - ? data?.rankPlusColor - ? new Color(data?.rankPlusColor) - : new Color('RED') - : null; - this.prefixColor = - 'MVP++' === this.rank ? (data?.monthlyRankColor ? new Color(data?.monthlyRankColor) : new Color('GOLD')) : null; - this.karma = data?.karma || 0; - this.achievements = recursive(data?.achievements) || {}; - this.achievementPoints = data?.achievementPoints || 0; - this.totalExperience = data?.networkExp || 0; - this.level = getPlayerLevel(this.totalExperience) || 0; - this.socialMedia = getSocialMedia(data?.socialMedia) || []; - this.giftBundlesSent = data?.giftingMeta?.realBundlesGiven || 0; - this.giftBundlesReceived = data?.giftingMeta?.realBundlesReceived || 0; - this.giftsSent = data?.giftingMeta?.giftsGiven || 0; - this.isOnline = - null !== this.lastLoginTimestamp && - null !== this.lastLogoutTimestamp && - this.lastLoginTimestamp > this.lastLogoutTimestamp; - this.lastDailyRewardTimestamp = data?.lastAdsenseGenerateTime || null; - this.lastDailyReward = this.lastDailyRewardTimestamp ? new Date(this.lastDailyRewardTimestamp) : null; - this.totalRewards = data?.totalRewards || 0; - this.totalDailyRewards = data?.totalDailyRewards || 0; - this.rewardStreak = data?.rewardStreak || 0; - this.rewardScore = data?.rewardScore || 0; - this.rewardHighScore = data?.rewardHighScore || 0; - this.levelProgress = playerLevelProgress(data?.networkExp); - this.stats = { - arcade: new Arcade({ ...data?.stats?.Arcade, ...data?.achievements }), - arena: 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) - }; - this.userLanguage = data?.userLanguage || 'ENGLISH'; - this.lastDailyReward = data.lastAdsenseGenerateTime ? new Date(data.lastAdsenseGenerateTime) : null; - this.lastDailyRewardTimestamp = data.lastAdsenseGenerateTime || null; - this.totalRewards = data.totalRewards || 0; - this.totalDailyRewards = data.totalDailyRewards || 0; - this.rewardStreak = data.rewardStreak || 0; - this.rewardScore = data.rewardScore || 0; - this.rewardHighScore = data.rewardHighScore || 0; - this.levelProgress = playerLevelProgress(data.networkExp); - this.userLanguage = data.userLanguage || 'ENGLISH'; - this.claimedLevelingRewards = parseClaimedRewards(data) || []; - this.globalCosmetics = new PlayerCosmetics(data); - 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 - }; - } - - toString(): string { - return this.nickname; - } -} - -export default Player; diff --git a/src/structures/Player/Achievements.test.ts b/src/structures/Player/Achievements.test.ts new file mode 100644 index 00000000..fbcd1568 --- /dev/null +++ b/src/structures/Player/Achievements.test.ts @@ -0,0 +1,29 @@ +import Achievements, { AchievementsRewards } from './Achievements'; +import { expect, expectTypeOf, test } from 'vitest'; + +test('Achievements Rewards', () => { + const data = new AchievementsRewards({ stats: 'meow' }); + expect(data).toBeDefined(); + expect(data).toBeInstanceOf(AchievementsRewards); + expectTypeOf(data).toEqualTypeOf(); +}); + +test('Achievements', () => { + const data = new Achievements({ stats: 'meow' }); + expect(data).toBeDefined(); + expect(data).toBeInstanceOf(Achievements); + 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/Achievements.ts b/src/structures/Player/Achievements.ts new file mode 100644 index 00000000..556b0836 --- /dev/null +++ b/src/structures/Player/Achievements.ts @@ -0,0 +1,36 @@ +export class AchievementsRewards { + [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 = Object.keys(item)[0]; + this[key] = item[key]; + }); + } +} + +class Achievements { + points: number; + rewards: AchievementsRewards; + tracking: string[]; + achivements: Record; + oneTime: string[]; + totem: Record; + constructor(data: Record) { + this.points = data?.achievementPoints || 0; + this.rewards = new AchievementsRewards(data?.achievementRewardsNew || {}); + this.tracking = data?.achievementTracking || []; + this.achivements = data?.achievements || {}; + this.oneTime = data.achievementsOneTime || []; + this.totem = data?.achievementTotem || {}; + } +} + +export default Achievements; diff --git a/src/structures/Player/Cosmetics.test.ts b/src/structures/Player/Cosmetics.test.ts new file mode 100644 index 00000000..ad7522ee --- /dev/null +++ b/src/structures/Player/Cosmetics.test.ts @@ -0,0 +1,35 @@ +import Cosmetics from './Cosmetics'; +import Pets from './Pets'; +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/PlayerCosmetics.ts b/src/structures/Player/Cosmetics.ts similarity index 90% rename from src/structures/PlayerCosmetics.ts rename to src/structures/Player/Cosmetics.ts index b72bad73..516c530d 100644 --- a/src/structures/PlayerCosmetics.ts +++ b/src/structures/Player/Cosmetics.ts @@ -1,11 +1,9 @@ import Pets from './Pets'; -import { removeSnakeCaseString } from '../utils/removeSnakeCase'; +import { removeSnakeCaseString } from '../../utils/removeSnakeCase'; -/** - * Player Cosmetics class - */ -class PlayerCosmetics { +class Cosmetics { cosmetics: string[]; + currentGadget: string | null; pets: Pets; suits: string[]; hats: string[]; @@ -18,6 +16,7 @@ class PlayerCosmetics { 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_')) @@ -54,4 +53,4 @@ class PlayerCosmetics { .map((x) => removeSnakeCaseString(x.replace('clickeffects_', ''))) || []; } } -export default PlayerCosmetics; +export default Cosmetics; diff --git a/src/structures/Player/Gifting.test.ts b/src/structures/Player/Gifting.test.ts new file mode 100644 index 00000000..a2f1960e --- /dev/null +++ b/src/structures/Player/Gifting.test.ts @@ -0,0 +1,25 @@ +import Gifting from './Gifting'; +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 00000000..5392b5ef --- /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/Parkour.test.ts b/src/structures/Player/Parkour.test.ts new file mode 100644 index 00000000..00a6a08c --- /dev/null +++ b/src/structures/Player/Parkour.test.ts @@ -0,0 +1,17 @@ +import Parkour from './Parkour'; +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 00000000..ddd4c2d4 --- /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 00000000..49bee5a4 --- /dev/null +++ b/src/structures/Player/Pet.test.ts @@ -0,0 +1,43 @@ +import Pet from './Pet'; +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/Pet.ts b/src/structures/Player/Pet.ts similarity index 96% rename from src/structures/Pet.ts rename to src/structures/Player/Pet.ts index 7908c5fa..7454744f 100644 --- a/src/structures/Pet.ts +++ b/src/structures/Player/Pet.ts @@ -1,4 +1,4 @@ -import { recursive } from '../utils/removeSnakeCase'; +import { recursive } from '../../utils/removeSnakeCase'; class Pet { isFavorite: boolean; diff --git a/src/structures/Player/Pets.test.ts b/src/structures/Player/Pets.test.ts new file mode 100644 index 00000000..699f6a22 --- /dev/null +++ b/src/structures/Player/Pets.test.ts @@ -0,0 +1,106 @@ +import Pet from './Pet'; +import Pets, { PetConsumables } from './Pets'; +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(); +}); + +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 00000000..8a19c475 --- /dev/null +++ b/src/structures/Player/Pets.ts @@ -0,0 +1,75 @@ +import Pet from './Pet'; + +export 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; + } +} + +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 00000000..c445dcac --- /dev/null +++ b/src/structures/Player/Player.test.ts @@ -0,0 +1,177 @@ +import Achievements from './Achievements'; +import Arcade from '../MiniGames/Arcade'; +import ArenaBrawl from '../MiniGames/ArenaBrawl'; +import BedWars from '../MiniGames/BedWars'; +import BlitzSurvivalGames from '../MiniGames/BlitzSurvivalGames'; +import BuildBattle from '../MiniGames/BuildBattle'; +import Color from '../Color'; +import CopsAndCrims from '../MiniGames/CopsAndCrims'; +import Cosmetics from './Cosmetics'; +import Duels from '../MiniGames/Duels'; +import Gifting from './Gifting'; +import Guild from '../Guild/Guild'; +import House from '../House'; +import Housing from '../Housing'; +import MegaWalls from '../MiniGames/MegaWalls'; +import MurderMystery from '../MiniGames/MurderMystery'; +import Paintball from '../MiniGames/Paintball'; +import Parkour from './Parkour'; +import Pit from '../MiniGames/Pit'; +import Player from './Player'; +import Quakecraft from '../MiniGames/Quakecraft'; +import Quests from './Quests'; +import RecentGame from '../RecentGame'; +import Rewards from './Rewards'; +import Seasonal from './Seasonal'; +import SkyWars from '../MiniGames/SkyWars'; +import SmashHeroes from '../MiniGames/SmashHeroes'; +import SocialMedia from './SocialMedia'; +import SpeedUHC from '../MiniGames/SpeedUHC'; +import TNTGames from '../MiniGames/TNTGames'; +import Tourney from './Tourney'; +import TurboKartRacers from '../MiniGames/TurboKartRacers'; +import UHC from '../MiniGames/UHC'; +import VampireZ from '../MiniGames/VampireZ'; +import Walls from '../MiniGames/Walls'; +import Warlords from '../MiniGames/Warlords'; +import WoolGames from '../MiniGames/WoolGames'; +import { ChatChannel, Language, LevelProgress, PlayerRank, PlayerStats, ScorpiusBribe } from './Types'; +import { expect, expectTypeOf, test } from 'vitest'; + +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.arena).toBeDefined(); + expect(data.stats.arena).toBeInstanceOf(ArenaBrawl); + expectTypeOf(data.stats.arena).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 00000000..4e626928 --- /dev/null +++ b/src/structures/Player/Player.ts @@ -0,0 +1,145 @@ +import Achievements from './Achievements'; +import Arcade from '../MiniGames/Arcade'; +import ArenaBrawl from '../MiniGames/ArenaBrawl'; +import BedWars from '../MiniGames/BedWars'; +import BlitzSurvivalGames from '../MiniGames/BlitzSurvivalGames'; +import BuildBattle from '../MiniGames/BuildBattle'; +import Color from '../Color'; +import CopsAndCrims from '../MiniGames/CopsAndCrims'; +import Cosmetics from './Cosmetics'; +import Duels from '../MiniGames/Duels'; +import Gifting from './Gifting'; +import Guild from '../Guild/Guild'; +import House from '../House'; +import Housing from '../Housing'; +import MegaWalls from '../MiniGames/MegaWalls'; +import MurderMystery from '../MiniGames/MurderMystery'; +import Paintball from '../MiniGames/Paintball'; +import Parkour from './Parkour'; +import Pit from '../MiniGames/Pit'; +import Quakecraft from '../MiniGames/Quakecraft'; +import Quests from './Quests'; +import RecentGame from '../RecentGame'; +import Rewards from './Rewards'; +import Seasonal from './Seasonal'; +import SkyWars from '../MiniGames/SkyWars'; +import SmashHeroes from '../MiniGames/SmashHeroes'; +import SocialMedia, { parseSocialMedia } from './SocialMedia'; +import SpeedUHC from '../MiniGames/SpeedUHC'; +import TNTGames from '../MiniGames/TNTGames'; +import Tourney from './Tourney'; +import TurboKartRacers from '../MiniGames/TurboKartRacers'; +import UHC from '../MiniGames/UHC'; +import VampireZ from '../MiniGames/VampireZ'; +import Walls from '../MiniGames/Walls'; +import Warlords from '../MiniGames/Warlords'; +import WoolGames from '../MiniGames/WoolGames'; +import { ChatChannel, Language, LevelProgress, PlayerRank, PlayerStats, ScorpiusBribe } from './Types'; +import { getRank, playerLevelProgress } from './Utils'; + +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: Achievements; + 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: Quests; + 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 Achievements(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 Quests(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, ...data?.achievements }), + arena: 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/Quests.test.ts b/src/structures/Player/Quests.test.ts new file mode 100644 index 00000000..3e2d8f55 --- /dev/null +++ b/src/structures/Player/Quests.test.ts @@ -0,0 +1,48 @@ +import Quests, { Quest, QuestCompletion, QuestCompletions } from './Quests'; +import { expect, expectTypeOf, test } from 'vitest'; + +test('Quest Completion', () => { + const data = new QuestCompletion({ time: 1688570159583 }); + expect(data).toBeDefined(); + expect(data).toBeInstanceOf(QuestCompletion); + 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(); +}); + +test('Quest Completions', () => { + const data = new QuestCompletions([{ time: 1688570159583 }]); + expect(data).toBeDefined(); + expect(data).toBeInstanceOf(QuestCompletions); + expectTypeOf(data).toEqualTypeOf(); + expect(data.amount).toBeDefined(); + expectTypeOf(data.amount).toEqualTypeOf(); + expect(data.completions).toBeDefined(); + expectTypeOf(data.completions).toEqualTypeOf(); +}); + +test('Quest', () => { + const data = new Quest({ stats: 'meow' }, 'meow'); + expect(data).toBeDefined(); + expect(data).toBeInstanceOf(Quest); + expectTypeOf(data).toEqualTypeOf(); + expect(data.name).toBeDefined(); + expectTypeOf(data.name).toEqualTypeOf(); + expect(data.completions).toBeDefined(); + expectTypeOf(data.completions).toEqualTypeOf(); +}); + +test('Quests', () => { + const data = new Quests({ stats: 'meow' }); + expect(data).toBeDefined(); + expect(data).toBeInstanceOf(Quests); + 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.ts b/src/structures/Player/Quests.ts new file mode 100644 index 00000000..a3fc99c0 --- /dev/null +++ b/src/structures/Player/Quests.ts @@ -0,0 +1,45 @@ +export class QuestCompletion { + 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 class QuestCompletions { + amount: number; + completions: QuestCompletion[]; + constructor(data: Record[]) { + this.amount = data.length || 0; + this.completions = []; + data.forEach((completion: Record) => { + this.completions.push(new QuestCompletion(completion)); + }); + } +} + +export class Quest { + name: string; + completions: QuestCompletions; + constructor(data: Record, name: string) { + this.name = name; + this.completions = new QuestCompletions(data?.completions || []); + } +} + +class Quests { + quests: Quest[]; + autoActivate: boolean; + constructor(data: Record, autoActivate: boolean = false) { + this.quests = []; + Object.keys(data).forEach((quest) => { + this.quests.push(new Quest(data[quest], quest)); + }); + this.autoActivate = autoActivate; + } +} + +export default Quests; diff --git a/src/structures/Player/Rewards.test.ts b/src/structures/Player/Rewards.test.ts new file mode 100644 index 00000000..a82ef1ff --- /dev/null +++ b/src/structures/Player/Rewards.test.ts @@ -0,0 +1,46 @@ +import Rewards, { MonthlyCrate } from './Rewards'; +import { expect, expectTypeOf, test } from 'vitest'; + +test('Monthly Crate', () => { + 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(); +}); + +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 00000000..9b4e79f7 --- /dev/null +++ b/src/structures/Player/Rewards.ts @@ -0,0 +1,44 @@ +export 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; + } +} + +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.test.ts b/src/structures/Player/Seasonal.test.ts new file mode 100644 index 00000000..4d4fe7be --- /dev/null +++ b/src/structures/Player/Seasonal.test.ts @@ -0,0 +1,77 @@ +import Seasonal, { Season, SeasonBingo, SeasonBingoTier, SeasonYear } from './Seasonal'; +import { SeasonName } from './Types'; +import { expect, expectTypeOf, test } from 'vitest'; + +test('Season Bingo Tier', () => { + 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(); +}); + +test('Season Bingo', () => { + 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(); +}); + +test('Season Year', () => { + 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>(); +}); + +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(); +}); + +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.ts b/src/structures/Player/Seasonal.ts new file mode 100644 index 00000000..a49053c5 --- /dev/null +++ b/src/structures/Player/Seasonal.ts @@ -0,0 +1,67 @@ +import { SeasonName } from './Types'; + +export class SeasonBingoTier { + objectives: Record; + rewards: string[]; + constructor(data: Record) { + this.objectives = data.objectives || {}; + this.rewards = data.rewards || []; + } +} + +export 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 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 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))); + } +} + +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 00000000..55f26135 --- /dev/null +++ b/src/structures/Player/SocialMedia.test.ts @@ -0,0 +1,14 @@ +import SocialMedia from './SocialMedia'; +import { SocialMediaId } from './Types'; +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 00000000..e4e11641 --- /dev/null +++ b/src/structures/Player/SocialMedia.ts @@ -0,0 +1,18 @@ +import { SocialMediaId } from './Types'; + +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.test.ts b/src/structures/Player/Tourney.test.ts new file mode 100644 index 00000000..8dfad59b --- /dev/null +++ b/src/structures/Player/Tourney.test.ts @@ -0,0 +1,38 @@ +import Tourney, { TourneyData } from './Tourney'; +import { expect, expectTypeOf, test } from 'vitest'; + +test('Tourney Data', () => { + 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(); +}); + +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.ts b/src/structures/Player/Tourney.ts new file mode 100644 index 00000000..e708e84b --- /dev/null +++ b/src/structures/Player/Tourney.ts @@ -0,0 +1,32 @@ +export 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; + } +} + +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/Types.d.ts b/src/structures/Player/Types.d.ts new file mode 100644 index 00000000..9ebda905 --- /dev/null +++ b/src/structures/Player/Types.d.ts @@ -0,0 +1,117 @@ +// Credits: Pixelic: https://github.com/pixelicc - Most types in player + +import Arcade from '../MiniGames/Arcade'; +import ArenaBrawl from '../MiniGames/ArenaBrawl'; +import BedWars from '../MiniGames/BedWars'; +import BlitzSurvivalGames from '../MiniGames/BlitzSurvivalGames'; +import BuildBattle from '../MiniGames/BuildBattle'; +import CopsAndCrims from '../MiniGames/CopsAndCrims'; +import Duels from '../MiniGames/Duels'; +import MegaWalls from '../MiniGames/MegaWalls'; +import MurderMystery from '../MiniGames/MurderMystery'; +import Paintball from '../MiniGames/Paintball'; +import Pit from '../MiniGames/Pit'; +import Quakecraft from '../MiniGames/Quakecraft'; +import SkyWars from '../MiniGames/SkyWars'; +import SmashHeroes from '../MiniGames/SmashHeroes'; +import SpeedUHC from '../MiniGames/SpeedUHC'; +import TNTGames from '../MiniGames/TNTGames'; +import TurboKartRacers from '../MiniGames/TurboKartRacers'; +import UHC from '../MiniGames/UHC'; +import VampireZ from '../MiniGames/VampireZ'; +import Walls from '../MiniGames/Walls'; +import Warlords from '../MiniGames/Warlords'; +import WoolGames from '../MiniGames/WoolGames'; + +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'; +type ChatChannel = 'ALL' | 'PARTY' | 'GUILD' | 'OFFICER' | 'PM' | 'SKYBLOCK_COOP'; +type SeasonName = 'christmas' | 'easter' | 'summer' | 'halloween' | 'anniversary'; +type SocialMediaId = 'DISCORD' | 'TWITTER' | 'YOUTUBE' | 'INSTAGRAM' | 'TIKTOK' | 'TWITCH' | 'HYPIXEL'; + +interface LevelProgress { + level: number; + xpToNext: number; + remainingXP: number; + currentXP: number; + percent: number; + percentRemaining: number; +} + +interface PlayerStats { + arcade: Arcade; + arena: 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; +} + +type PlayerRank = + | null + | 'VIP' + | 'VIP+' + | 'MVP' + | 'MVP+' + | 'MVP++' + | 'Game Master' + | 'Admin' + | 'YouTube' + | 'Events' + | 'Mojang' + | 'Owner' + | 'PIG+++' + | 'Innit'; + +interface RanksPurchaseTime { + VIP: Date | null; + VIP_PLUS: Date | null; + MVP: Date | null; + MVP_PLUS: Date | null; +} + +interface ScorpiusBribe { + year: number; + timestamp: number; +} diff --git a/src/utils/Player.test.ts b/src/structures/Player/Utils.test.ts similarity index 68% rename from src/utils/Player.test.ts rename to src/structures/Player/Utils.test.ts index 206ad37a..a21a8f3d 100644 --- a/src/utils/Player.test.ts +++ b/src/structures/Player/Utils.test.ts @@ -1,32 +1,23 @@ -/* eslint-disable camelcase */ import { describe, expect, test } from 'vitest'; -import { - getPlayerLevel, - getRank, - getSocialMedia, - levelToXP, - parseClaimedRewards, - playerLevelProgress, - xpToNextLevel -} from '../utils/Player'; +import { getPlayerLevel, getRank, levelToXP, parseClaimedRewards, playerLevelProgress, xpToNextLevel } from './Utils'; 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]' })).toBe('Default'); + expect(getRank({ prefix: '[meow]' })).toBeNull(); expect(getRank({ rank: 'ADMIN' })).toBe('Admin'); expect(getRank({ rank: 'GAME_MASTER' })).toBe('Game Master'); - expect(getRank({ rank: 'Meow' })).toBe('Default'); + 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' })).toBe('Default'); + expect(getRank({ newPackageRank: 'meow' })).toBeNull(); }); test('getPlayerLevel', () => { @@ -69,31 +60,15 @@ test('playerLevelProgress', () => { }); }); -test('getSocialMedia', () => { - describe('should return the formatted social media links', () => { - const data = { - links: { - TWITTER: 'https://twitter.com/example', - YOUTUBE: 'https://youtube.com/example', - INSTAGRAM: 'https://instagram.com/example' - } - }; - const expectedSocialMedia = [ - { name: 'Twitter', link: 'https://twitter.com/example', id: 'TWITTER' }, - { name: 'YouTube', link: 'https://youtube.com/example', id: 'YOUTUBE' }, - { name: 'Instagram', link: 'https://instagram.com/example', id: 'INSTAGRAM' } - ]; - expect(getSocialMedia(data)).toEqual(expectedSocialMedia); - }); -}); - 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/Player.ts b/src/structures/Player/Utils.ts similarity index 75% rename from src/utils/Player.ts rename to src/structures/Player/Utils.ts index eb365170..63749135 100644 --- a/src/utils/Player.ts +++ b/src/structures/Player/Utils.ts @@ -1,4 +1,4 @@ -import { LevelProgress, PlayerRank, PlayerSocialMedia } from '../structures/Player'; +import { LevelProgress, PlayerRank } from './Types'; export function getRank(player: Record): PlayerRank { if (player.prefix) { @@ -12,7 +12,7 @@ export function getRank(player: Record): PlayerRank { case 'INNIT': return 'Innit'; default: - return 'Default'; + return null; } } else if (player.rank) { switch (player.rank) { @@ -21,7 +21,7 @@ export function getRank(player: Record): PlayerRank { case 'GAME_MASTER': return 'Game Master'; default: - return 'Default'; + return null; } } else { switch (player.newPackageRank) { @@ -34,7 +34,7 @@ export function getRank(player: Record): PlayerRank { case 'VIP': return 'VIP'; default: - return 'Default'; + return null; } } } @@ -71,17 +71,14 @@ export function playerLevelProgress(xp: number): LevelProgress { 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 }; -} - -export function getSocialMedia(data: Record): PlayerSocialMedia[] { - const links = data?.links || {}; - const formattedNames = ['Twitter', 'YouTube', 'Instagram', 'Twitch', 'Hypixel', 'Discord']; - const upperNames = ['TWITTER', 'YOUTUBE', 'INSTAGRAM', 'TWITCH', 'HYPIXEL', 'DISCORD']; - 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] })); + return { + level: getPlayerLevel(xp), + xpToNext, + remainingXP, + currentXP, + percent, + percentRemaining + }; } export function parseClaimedRewards(data: Record): number[] { diff --git a/src/structures/SkyBlock/Bazaar/Product.test.ts b/src/structures/SkyBlock/Bazaar/Product.test.ts index 92e8b23e..cd155419 100644 --- a/src/structures/SkyBlock/Bazaar/Product.test.ts +++ b/src/structures/SkyBlock/Bazaar/Product.test.ts @@ -2,8 +2,8 @@ import Product from './Product'; import { expect, expectTypeOf, test } from 'vitest'; test('Product', () => { - /* eslint-disable camelcase */ const data = new Product({ + /* eslint-disable camelcase */ product_id: 'INK_SACK:3', sell_summary: [ { amount: 133865, pricePerUnit: 1.4, orders: 2 }, @@ -41,8 +41,9 @@ test('Product', () => { buyMovingWeek: 39972807, buyOrders: 152 } + /* eslint-enable camelcase */ }); - /* eslint-enable camelcase */ + expect(data).toBeDefined(); expect(data).toBeInstanceOf(Product); expectTypeOf(data).toEqualTypeOf();