|
| 1 | +/** |
| 2 | + * Copyright (c) Statsify |
| 3 | + * |
| 4 | + * This source code is licensed under the GNU GPL v3 license found in the |
| 5 | + * LICENSE file in the root directory of this source tree. |
| 6 | + * https://github.com/Statsify/statsify/blob/main/LICENSE |
| 7 | + */ |
| 8 | + |
| 9 | +import { |
| 10 | + ArcadeModes, |
| 11 | + DisasterSurvivals, |
| 12 | + Disasters, |
| 13 | + DisastersDeaths, |
| 14 | + SubModeForMode, |
| 15 | +} from "@statsify/schemas"; |
| 16 | +import { LocalizeFunction } from "@statsify/discord"; |
| 17 | +import { Table } from "#components"; |
| 18 | +import { arrayGroup, formatTime } from "@statsify/util"; |
| 19 | + |
| 20 | +interface DisastersTableProps { |
| 21 | + stats: Disasters; |
| 22 | + submode: SubModeForMode<ArcadeModes, "disasters">; |
| 23 | + t: LocalizeFunction; |
| 24 | +} |
| 25 | + |
| 26 | +export const DisastersTable = ({ stats, t, submode }: DisastersTableProps) => { |
| 27 | + if (submode.api === "survivals") |
| 28 | + return <DisastersSurvivalsTable stats={stats} t={t} />; |
| 29 | + if (submode.api === "deaths") |
| 30 | + return <DisastersDeathsTable stats={stats} t={t} />; |
| 31 | + |
| 32 | + return ( |
| 33 | + <Table.table> |
| 34 | + <Table.tr> |
| 35 | + <Table.td title={t("stats.wins")} value={t(stats.wins)} color="§a" /> |
| 36 | + <Table.td |
| 37 | + title={t("stats.losses")} |
| 38 | + value={t(stats.losses)} |
| 39 | + color="§c" |
| 40 | + /> |
| 41 | + <Table.td title={t("stats.wlr")} value={t(stats.wlr)} color="§6" /> |
| 42 | + </Table.tr> |
| 43 | + <Table.tr> |
| 44 | + <Table.td |
| 45 | + title={t("stats.gamesPlayed")} |
| 46 | + value={t(stats.gamesPlayed)} |
| 47 | + color="§e" |
| 48 | + /> |
| 49 | + <Table.td |
| 50 | + title={t("stats.playtime")} |
| 51 | + value={formatTime(stats.playtime)} |
| 52 | + color="§b" |
| 53 | + /> |
| 54 | + <Table.td |
| 55 | + title={t("stats.survivals")} |
| 56 | + value={t(stats.survivals.overall)} |
| 57 | + color="§d" |
| 58 | + /> |
| 59 | + </Table.tr> |
| 60 | + </Table.table> |
| 61 | + ); |
| 62 | +}; |
| 63 | + |
| 64 | +const DisasterSurvivalsLabels: Record<keyof DisasterSurvivals, string> = { |
| 65 | + overall: "§l§fOVERALL", |
| 66 | + acidRain: "§l§aACID RAIN", |
| 67 | + anvilRain: "§l§7ANVIL RAIN §7[S]", |
| 68 | + batSwarm: "§l§8BAT SWARM §7[S]", |
| 69 | + blackout: "§l§5BLACKOUT §7[S]", |
| 70 | + disco: "§l§dDISCO §7[S]", |
| 71 | + dragons: "§l§5DRAGONS", |
| 72 | + flood: "§l§9FLOOD", |
| 73 | + fragileGround: "§l§7FRAGILE GROUND", |
| 74 | + grounded: "§l§2GROUNDED §7[S]", |
| 75 | + halfHealth: "§l§aHALF HEALTH §7[S]", |
| 76 | + hotPotato: "§l§6HOT POTATO §7[S]", |
| 77 | + hypixelSays: "§l§6HYPIXEL SAYS §7[S]", |
| 78 | + lightning: "§l§eLIGHTNING", |
| 79 | + meteorShower: "§l§cMETEOR SHOWER", |
| 80 | + nuke: "§l§cNUKE §7[S]", |
| 81 | + purge: "§l§aPURGE §7[S]", |
| 82 | + redLightGreenLight: "§l§cRED LIGHT§r§f, §l§aGREEN LIGHT §7[S]", |
| 83 | + sinkhole: "§l§6SINKHOLE", |
| 84 | + solarFlare: "§l§6SOLAR FLARE", |
| 85 | + stampede: "§l§6STAMPEDE", |
| 86 | + swappage: "§l§dSWAPPAGE §7[S]", |
| 87 | + theFloorIsLava: "§l§cTHE FLOOR IS LAVA", |
| 88 | + tntRain: "§l§4TNT RAIN", |
| 89 | + tornado: "§l§7TORNADO", |
| 90 | + werewolf: "§l§cWEREWOLF §7[S]", |
| 91 | + withers: "§l§3WITHERS", |
| 92 | + zombieApocalypse: "§l§2ZOMBIE APOCALYPSE", |
| 93 | +}; |
| 94 | + |
| 95 | +const DisastersSurvivalsTable = ({ |
| 96 | + stats, |
| 97 | + t, |
| 98 | +}: Omit<DisastersTableProps, "submode">) => { |
| 99 | + const entries = Object.entries(DisasterSurvivalsLabels) as [ |
| 100 | + keyof DisasterSurvivals, |
| 101 | + string |
| 102 | + ][]; |
| 103 | + |
| 104 | + const rows = arrayGroup( |
| 105 | + entries |
| 106 | + .map(([key, label]) => ({ label, survivals: stats.survivals[key] })) |
| 107 | + .toSorted((a, b) => b.survivals - a.survivals), |
| 108 | + 2 |
| 109 | + ); |
| 110 | + |
| 111 | + return ( |
| 112 | + <> |
| 113 | + {rows.map((row) => ( |
| 114 | + <Table.tr> |
| 115 | + {row.map(({ label, survivals }) => ( |
| 116 | + <Table.td |
| 117 | + title={label} |
| 118 | + value={t(survivals)} |
| 119 | + size="inline" |
| 120 | + color="§f" |
| 121 | + /> |
| 122 | + ))} |
| 123 | + </Table.tr> |
| 124 | + ))} |
| 125 | + </> |
| 126 | + ); |
| 127 | +}; |
| 128 | + |
| 129 | +const DisastersDeathsLabels: Record<keyof DisastersDeaths, string> = { |
| 130 | + overall: "§l§fOVERALL", |
| 131 | + acidRain: "§l§aACID RAIN", |
| 132 | + anvilRain: "§l§7ANVIL RAIN §7[S]", |
| 133 | + batSwarm: "§l§8BAT SWARM §7[S]", |
| 134 | + disco: "§l§dDISCO §7[S]", |
| 135 | + dragons: "§l§5DRAGONS", |
| 136 | + fall: "§l§eFALL", |
| 137 | + flood: "§l§9FLOOD", |
| 138 | + hotPotato: "§l§6HOT POTATO §7[S]", |
| 139 | + hypixelSays: "§l§6HYPIXEL SAYS §7[S]", |
| 140 | + lightning: "§l§eLIGHTNING", |
| 141 | + nuke: "§l§cNUKE §7[S]", |
| 142 | + redLightGreenLight: "§l§cRED LIGHT§r§f, §l§aGREEN LIGHT §7[S]", |
| 143 | + sinkhole: "§l§6SINKHOLE", |
| 144 | + solarFlare: "§l§6SOLAR FLARE", |
| 145 | + stampede: "§l§6STAMPEDE", |
| 146 | + theFloorIsLava: "§l§cTHE FLOOR IS LAVA", |
| 147 | + tntRain: "§l§4TNT RAIN", |
| 148 | + tornado: "§l§7TORNADO", |
| 149 | + unknown: "§l§4UNKNOWN", |
| 150 | + void: "§l§5VOID", |
| 151 | + werewolf: "§l§cWEREWOLF §7[S]", |
| 152 | + withers: "§l§3WITHERS", |
| 153 | + zombieApocalypse: "§l§2ZOMBIE APOCALYPSE", |
| 154 | +}; |
| 155 | + |
| 156 | +const DisastersDeathsTable = ({ |
| 157 | + stats, |
| 158 | + t, |
| 159 | +}: Omit<DisastersTableProps, "submode">) => { |
| 160 | + const entries = Object.entries(DisastersDeathsLabels) as [ |
| 161 | + keyof DisastersDeaths, |
| 162 | + string |
| 163 | + ][]; |
| 164 | + |
| 165 | + const rows = arrayGroup( |
| 166 | + entries |
| 167 | + .map(([key, label]) => ({ label, deaths: stats.deaths[key] })) |
| 168 | + .toSorted((a, b) => b.deaths - a.deaths), |
| 169 | + 2 |
| 170 | + ); |
| 171 | + |
| 172 | + return ( |
| 173 | + <> |
| 174 | + {rows.map((row) => ( |
| 175 | + <Table.tr> |
| 176 | + {row.map(({ label, deaths }) => ( |
| 177 | + <Table.td |
| 178 | + title={label} |
| 179 | + value={t(deaths)} |
| 180 | + size="inline" |
| 181 | + color="§f" |
| 182 | + /> |
| 183 | + ))} |
| 184 | + </Table.tr> |
| 185 | + ))} |
| 186 | + </> |
| 187 | + ); |
| 188 | +}; |
0 commit comments