diff --git a/apps/discord-bot/src/commands/arcade/modes/overall-arcade.tsx b/apps/discord-bot/src/commands/arcade/modes/overall-arcade.tsx index 1caa84333..f074cae81 100644 --- a/apps/discord-bot/src/commands/arcade/modes/overall-arcade.tsx +++ b/apps/discord-bot/src/commands/arcade/modes/overall-arcade.tsx @@ -44,7 +44,7 @@ export const OverallArcadeTable = ({ stats, t }: OverallArcadeTableProps) => { const rows = arrayGroup(games, rowSize); - const colors = ["§a", "§2", "§e", "§6", "§c", "§4"]; + const colors = ["§d", "§b", "§a", "§e", "§6", "§c"]; return ( diff --git a/apps/discord-bot/src/commands/challenges/challenges.profile.tsx b/apps/discord-bot/src/commands/challenges/challenges.profile.tsx index 4e97e2f3e..c2b5e309c 100644 --- a/apps/discord-bot/src/commands/challenges/challenges.profile.tsx +++ b/apps/discord-bot/src/commands/challenges/challenges.profile.tsx @@ -7,15 +7,38 @@ */ import { + ArcadeChallenges, + ArenaBrawlChallenges, + BedWarsChallenges, + BlitzSGChallenges, + BuildBattleChallenges, ChallengeModes, Challenges, + CopsAndCrimsChallenges, + DuelsChallenges, FormattedGame, GameChallenges, type GameId, type GameMode, + MegaWallsChallenges, + MetadataEntry, MetadataScanner, + MurderMysteryChallenges, + PaintballChallenges, + QuakeChallenges, + SkyWarsChallenges, + SmashHeroesChallenges, + SpeedUHCChallenges, + TNTGamesChallenges, + TurboKartRacersChallenges, + UHCChallenges, + VampireZChallenges, + WallsChallenges, + WarlordsChallenges, + WoolGamesChallenges, } from "@statsify/schemas"; import { Container, Footer, GameList, Header, SidebarItem, Table } from "#components"; + import { arrayGroup, prettify } from "@statsify/util"; import type { BaseProfileProps } from "#commands/base.hypixel-command"; import type { Image } from "skia-canvas"; @@ -44,12 +67,36 @@ const NormalTable = ({ challenges, t, gameIcons }: NormalTableProps) => { interface GameTableProps { gameChallenges: GameChallenges; - constructor: any; + mode: Exclude["api"], "overall">; t: LocalizeFunction; } -const GameTable = ({ gameChallenges, constructor, t }: GameTableProps) => { - const metadata = MetadataScanner.scan(constructor); +const METADATA: Record["api"], "overall">, MetadataEntry[]> = { + ARCADE: MetadataScanner.scan(ArcadeChallenges), + ARENA_BRAWL: MetadataScanner.scan(ArenaBrawlChallenges), + BEDWARS: MetadataScanner.scan(BedWarsChallenges), + BLITZSG: MetadataScanner.scan(BlitzSGChallenges), + BUILD_BATTLE: MetadataScanner.scan(BuildBattleChallenges), + COPS_AND_CRIMS: MetadataScanner.scan(CopsAndCrimsChallenges), + DUELS: MetadataScanner.scan(DuelsChallenges), + MEGAWALLS: MetadataScanner.scan(MegaWallsChallenges), + MURDER_MYSTERY: MetadataScanner.scan(MurderMysteryChallenges), + PAINTBALL: MetadataScanner.scan(PaintballChallenges), + QUAKE: MetadataScanner.scan(QuakeChallenges), + SKYWARS: MetadataScanner.scan(SkyWarsChallenges), + SMASH_HEROES: MetadataScanner.scan(SmashHeroesChallenges), + SPEED_UHC: MetadataScanner.scan(SpeedUHCChallenges), + TNT_GAMES: MetadataScanner.scan(TNTGamesChallenges), + TURBO_KART_RACERS: MetadataScanner.scan(TurboKartRacersChallenges), + UHC: MetadataScanner.scan(UHCChallenges), + VAMPIREZ: MetadataScanner.scan(VampireZChallenges), + WALLS: MetadataScanner.scan(WallsChallenges), + WARLORDS: MetadataScanner.scan(WarlordsChallenges), + WOOLGAMES: MetadataScanner.scan(WoolGamesChallenges), +}; + +const GameTable = ({ gameChallenges, mode, t }: GameTableProps) => { + const metadata = METADATA[mode]; const entries = Object.entries(gameChallenges); const GROUP_SIZE = entries.length < 5 ? 4 : (entries.length - 1) ** 0.5; @@ -59,8 +106,9 @@ const GameTable = ({ gameChallenges, constructor, t }: GameTableProps) => { .filter(([k]) => k !== "total") .sort((a, b) => b[1] - a[1]) .map(([challenge, completions]) => { - const field = metadata.find(([k]) => k === challenge); - const realName = field?.[1]?.leaderboard?.name ?? prettify(challenge); + const [_, field] = metadata.find(([k]) => k === challenge)!; + + const realName = field.leaderboard?.name ?? prettify(challenge); return [realName, t(completions)]; }), GROUP_SIZE @@ -107,7 +155,7 @@ export const ChallengesProfile = ({ table = ( ); diff --git a/apps/discord-bot/src/commands/ratios/ratios.command.tsx b/apps/discord-bot/src/commands/ratios/ratios.command.tsx index 43bb2a4fb..a097d62d6 100644 --- a/apps/discord-bot/src/commands/ratios/ratios.command.tsx +++ b/apps/discord-bot/src/commands/ratios/ratios.command.tsx @@ -20,6 +20,7 @@ import { MEGAWALLS_MODES, MURDER_MYSTERY_MODES, PAINTBALL_MODES, + PIT_MODES, Player, PlayerStats, QUAKE_MODES, @@ -128,6 +129,11 @@ export class RatiosCommand { return this.run(context, PAINTBALL_MODES); } + @SubCommand({ description: (t) => t("commands.ratios-pit"), args }) + public pit(context: CommandContext) { + return this.run(context, PIT_MODES); + } + @SubCommand({ description: (t) => t("commands.ratios-quake"), args, group: "classic" }) public quake(context: CommandContext) { return this.run(context, QUAKE_MODES); diff --git a/apps/discord-bot/src/commands/ratios/ratios.profile.tsx b/apps/discord-bot/src/commands/ratios/ratios.profile.tsx index a66ddb67f..101ff6aa1 100644 --- a/apps/discord-bot/src/commands/ratios/ratios.profile.tsx +++ b/apps/discord-bot/src/commands/ratios/ratios.profile.tsx @@ -92,9 +92,7 @@ export type RatioWithStats = [ export interface RatiosProfileProps extends Omit { mode: GameMode; - ratios: RatioWithStats[]; - gameName: FormattedGame; } diff --git a/apps/discord-bot/src/commands/woolgames/sheepwars.table.tsx b/apps/discord-bot/src/commands/woolgames/sheepwars.table.tsx index 1f61e2a0e..d2171719a 100644 --- a/apps/discord-bot/src/commands/woolgames/sheepwars.table.tsx +++ b/apps/discord-bot/src/commands/woolgames/sheepwars.table.tsx @@ -25,7 +25,6 @@ export const SheepWarsTable = ({ sheepwars, t }: SheepWarsTableProps) => { - @@ -33,9 +32,8 @@ export const SheepWarsTable = ({ sheepwars, t }: SheepWarsTableProps) => { - - - + + ); diff --git a/apps/discord-bot/src/commands/woolgames/woolgames.profile.tsx b/apps/discord-bot/src/commands/woolgames/woolgames.profile.tsx index 9f610b29b..1cc74fd3e 100644 --- a/apps/discord-bot/src/commands/woolgames/woolgames.profile.tsx +++ b/apps/discord-bot/src/commands/woolgames/woolgames.profile.tsx @@ -71,6 +71,10 @@ export const WoolGamesProfile = ({ case "sheepwars": table = ; + sidebar.push( + [t("stats.magicWool"), t(woolgames.sheepwars.magicWool), "§5"], + [t("stats.sheepThrown"), t(woolgames.sheepwars.sheepThrown), "§c"] + ); break; } diff --git a/apps/discord-bot/src/constants.ts b/apps/discord-bot/src/constants.ts index d0c00a80e..06b42c9cd 100644 --- a/apps/discord-bot/src/constants.ts +++ b/apps/discord-bot/src/constants.ts @@ -402,6 +402,7 @@ export const MODES_TO_API = new Map, keyof Playe [MEGAWALLS_MODES, "megawalls"], [MURDER_MYSTERY_MODES, "murdermystery"], [PAINTBALL_MODES, "paintball"], + [PIT_MODES, "pit"], [PARKOUR_MODES, "parkour"], [QUAKE_MODES, "quake"], [SKYWARS_MODES, "skywars"], @@ -429,6 +430,7 @@ export const MODES_TO_FORMATTED = new Map, Forma [MEGAWALLS_MODES, FormattedGame.MEGAWALLS], [MURDER_MYSTERY_MODES, FormattedGame.MURDER_MYSTERY], [PAINTBALL_MODES, FormattedGame.PAINTBALL], + [PIT_MODES, FormattedGame.PIT], [PARKOUR_MODES, FormattedGame.PARKOUR], [QUAKE_MODES, FormattedGame.QUAKE], [SKYWARS_MODES, FormattedGame.SKYWARS], diff --git a/locales/en-US/default.json b/locales/en-US/default.json index aa49f6e1c..65e025f72 100644 --- a/locales/en-US/default.json +++ b/locales/en-US/default.json @@ -187,6 +187,7 @@ "ratios-megawalls": "$t(commands.ratios-command, { \"name\": \"MegaWalls\" })", "ratios-murdermystery": "$t(commands.ratios-command, { \"name\": \"Murder Mystery\" })", "ratios-paintball": "$t(commands.ratios-command, { \"name\": \"Paintball\" })", + "ratios-pit": "$t(commands.ratios-command, { \"name\": \"Pit\" })", "ratios-quake": "$t(commands.ratios-command, { \"name\": \"Quake\" })", "ratios-skywars": "$t(commands.ratios-command, { \"name\": \"SkyWars\" })", "ratios-smashheroes": "$t(commands.ratios-command, { \"name\": \"Smash Heroes\" })", @@ -786,7 +787,7 @@ "arcadeWins": "Arcade Wins", "draws": "Draws", "sheepThrown": "Sheep Thrown", - "magicWoolHit": "Magic Wool" + "magicWool": "Magic Wool" }, "tips": { "discord": "$t(emojis:socials.discord) Join our **$t(socials.discord)** and get **20% lower cooldowns** $t(emojis:heart)", diff --git a/packages/discord/src/services/paginate.service.ts b/packages/discord/src/services/paginate.service.ts index 4237273d1..c124affc7 100644 --- a/packages/discord/src/services/paginate.service.ts +++ b/packages/discord/src/services/paginate.service.ts @@ -106,6 +106,7 @@ export class PaginateService { currentIndex = index; currentSubIndex = 0; +<<<<<<< HEAD if ("subPages" in pages[index] && pages[index].subPages.length > 1) { subController = new PageController(pages[index].subPages, currentSubIndex); subController.register(listener, (interaction, subIndex) => handler(interaction, currentIndex, subIndex)); @@ -128,6 +129,31 @@ export class PaginateService { function onTimeout() { mainController.unregister(listener); subController?.unregister(listener); +||||||| aee3ac6 +======= + if ("subPages" in pages[index]) { + subController = new PageController(pages[index].subPages, currentSubIndex); + subController.register(listener, (interaction, subIndex) => handler(interaction, currentIndex, subIndex)); + } else { + subController = undefined; + } + } else if (subIndex !== currentSubIndex) { + subController?.switchPage(subIndex); + currentSubIndex = subIndex; + } + + const message = await getMessage(index, subIndex); + + message.components = [mainController.getActionRow(), subController?.getActionRow()] + .filter((row) => row !== undefined); + + return context.reply(message); + } + + function onTimeout() { + mainController.unregister(listener); + subController?.unregister(listener); +>>>>>>> main cache.clear(); return context.reply({ components: [] }); } diff --git a/packages/schemas/src/player/gamemodes/challenges/index.ts b/packages/schemas/src/player/gamemodes/challenges/index.ts index 22b42096a..7c18a90d7 100644 --- a/packages/schemas/src/player/gamemodes/challenges/index.ts +++ b/packages/schemas/src/player/gamemodes/challenges/index.ts @@ -163,3 +163,4 @@ export class Challenges { } export * from "./game-challenges.js"; +export * from "./modes/index.js"; diff --git a/packages/schemas/src/player/gamemodes/pit/index.ts b/packages/schemas/src/player/gamemodes/pit/index.ts index 3aa7ac08e..40ac91f9f 100644 --- a/packages/schemas/src/player/gamemodes/pit/index.ts +++ b/packages/schemas/src/player/gamemodes/pit/index.ts @@ -19,7 +19,10 @@ import { getPrestigeReq, } from "./util.js"; -export const PIT_MODES = new GameModes([{ api: "overall", hypixel: "PIT", formatted: "Pit" }] as const); +export const PIT_MODES = new GameModes([ + { api: "overall" }, + { hypixel: "PIT", formatted: "Pit" }, +] as const); export type PitModes = ExtractGameModes; diff --git a/packages/schemas/src/player/gamemodes/woolgames/capture-the-wool.ts b/packages/schemas/src/player/gamemodes/woolgames/capture-the-wool.ts index 0ebd08941..477c45511 100644 --- a/packages/schemas/src/player/gamemodes/woolgames/capture-the-wool.ts +++ b/packages/schemas/src/player/gamemodes/woolgames/capture-the-wool.ts @@ -86,30 +86,30 @@ export class CaptureTheWool { public deathsAsWoolHolder: number; public constructor(data: APIData = {}) { - this.wins = data.woolhunt_participated_wins; - this.losses = data.woolhunt_participated_losses; + this.wins = data.participated_wins; + this.losses = data.participated_losses; this.wlr = ratio(this.wins, this.losses); - this.draws = data.woolhunt_participated_draws; + this.draws = data.participated_draws; - this.kills = data.woolhunt_kills; - this.deaths = data.woolhunt_deaths; + this.kills = data.kills; + this.deaths = data.deaths; this.kdr = ratio(this.kills, this.deaths); - this.assists = data.woolhunt_assists; + this.assists = data.assists; - this.woolCaptured = data.woolhunt_wools_captured; - this.woolPickedUp = data.woolhunt_wools_stolen; + this.woolCaptured = data.wools_captured; + this.woolPickedUp = data.wools_stolen; - this.longestGame = (data.woolhunt_longest_game ?? 0) * 1000; - this.fastestWin = (data.woolhunt_fastest_win ?? 0) * 1000; - this.fastestWoolCapture = (data.woolhunt_fastest_wool_capture ?? 0) * 1000; + this.longestGame = (data.longest_game ?? 0) * 1000; + this.fastestWin = (data.fastest_win ?? 0) * 1000; + this.fastestWoolCapture = (data.fastest_wool_capture ?? 0) * 1000; - this.goldEarned = data.woolhunt_gold_earned; - this.goldSpent = Math.abs(data.woolhunt_gold_spent ?? 0); + this.goldEarned = data.gold_earned; + this.goldSpent = Math.abs(data.gold_spent ?? 0); - this.killsOnWoolHolder = data.woolhunt_kills_on_woolholder; - this.deathsToWoolHolder = data.woolhunt_deaths_to_woolholder; + this.killsOnWoolHolder = data.kills_on_woolholder; + this.deathsToWoolHolder = data.deaths_to_woolholder; - this.killsAsWoolHolder = data.woolhunt_kills_with_wool; - this.deathsAsWoolHolder = data.woolhunt_deaths_with_wool; + this.killsAsWoolHolder = data.kills_with_wool; + this.deathsAsWoolHolder = data.deaths_with_wool; } }