feat: core chunk 7

This commit is contained in:
TrèsAbhi committed 2023-10-14 11:36:10 -05:00
1 parent d726005c38
commit 01dd7ad9c6
39 files changed
+83 -87

No files matched your search

+2 -2
View File
@@ -1,11 +1,11 @@
import { SlashCommandBuilder } from 'discord.js';
import packageJSON from '../../package.json' assert { type: 'json' };
import markdownTable from '../LEGACY_core/discord/markdownTable';
import getClientId from '../LEGACY_core/node/getClientId';
import getClientId from '../core/blitzkrieg/getClientId';
import { tankAverages } from '../core/blitzstars/tankAverages';
import { tankopedia } from '../core/blitzstars/tankopedia';
import { client } from '../core/discord/client';
import embedInfo from '../core/discord/embedInfo';
import markdownTable from '../core/discord/markdownTable';
import { CommandRegistry } from '../events/interactionCreate';
const executionStart = new Date().getTime();
+2 -4
View File
@@ -1,8 +1,4 @@
import { SlashCommandBuilder } from 'discord.js';
import markdownTable, {
TableInput,
} from '../LEGACY_core/discord/markdownTable';
import resolvePlayerFromCommand from '../LEGACY_core/discord/resolvePlayerFromCommand';
import { getAccountInfo } from '../core/blitz/getAccountInfo';
import getPeriodNow from '../core/blitzkrieg/getPeriodNow';
import getTimeDaysAgo from '../core/blitzkrieg/getTimeDaysAgo';
@@ -12,6 +8,8 @@ import { tankopedia } from '../core/blitzstars/tankopedia';
import addUsernameChoices from '../core/discord/addUsernameChoices';
import embedNegative from '../core/discord/embedNegative';
import embedPositive from '../core/discord/embedPositive';
import markdownTable, { TableInput } from '../core/discord/markdownTable';
import resolvePlayerFromCommand from '../core/discord/resolvePlayerFromCommand';
import calculateWN8 from '../core/statistics/calculateWN8';
import sumStats from '../core/statistics/sumStats';
import { CommandRegistry } from '../events/interactionCreate';
+10 -10
View File
@@ -2,15 +2,6 @@ import {
SlashCommandBuilder,
SlashCommandSubcommandGroupBuilder,
} from 'discord.js';
import primaryButton from '../LEGACY_core/discord/primaryButton';
import resolvePeriodFromButton from '../LEGACY_core/discord/resolvePeriodFromButton';
import resolvePeriodFromCommand, {
ResolvedPeriod,
} from '../LEGACY_core/discord/resolvePeriodFromCommand';
import resolvePlayerFromButton from '../LEGACY_core/discord/resolvePlayerFromButton';
import resolvePlayerFromCommand, {
ResolvedPlayer,
} from '../LEGACY_core/discord/resolvePlayerFromCommand';
import * as Graph from '../components/Graph';
import NoData, { NoDataType } from '../components/NoData';
import TitleBar from '../components/TitleBar';
@@ -27,8 +18,17 @@ import addTankChoices from '../core/discord/addTankChoices';
import addUsernameChoices from '../core/discord/addUsernameChoices';
import autocompleteTanks from '../core/discord/autocompleteTanks';
import autocompleteUsername from '../core/discord/autocompleteUsername';
import buttonPrimary from '../core/discord/buttonPrimary';
import commandToURL from '../core/discord/commandToURL';
import { getCustomPeriodParams } from '../core/discord/getCustomPeriodParams';
import resolvePeriodFromButton from '../core/discord/resolvePeriodFromButton';
import resolvePeriodFromCommand, {
ResolvedPeriod,
} from '../core/discord/resolvePeriodFromCommand';
import resolvePlayerFromButton from '../core/discord/resolvePlayerFromButton';
import resolvePlayerFromCommand, {
ResolvedPlayer,
} from '../core/discord/resolvePlayerFromCommand';
import { CommandRegistryRaw } from '../events/interactionCreate';
type EvolutionStatType = 'player' | 'tank';
@@ -162,7 +162,7 @@ export const evolutionCommand = new Promise<CommandRegistryRaw>(
return [
await render(player, period, commandGroup, tankId),
primaryButton(path, 'Refresh'),
buttonPrimary(path, 'Refresh'),
await getBlitzStarsLinkButton(
player.region,
player.id,
+10 -10
View File
@@ -1,13 +1,4 @@
import { SlashCommandBuilder } from 'discord.js';
import { refreshButton } from '../LEGACY_core/discord/refreshButton';
import resolvePeriodFromButton from '../LEGACY_core/discord/resolvePeriodFromButton';
import resolvePeriodFromCommand, {
ResolvedPeriod,
} from '../LEGACY_core/discord/resolvePeriodFromCommand';
import resolvePlayerFromButton from '../LEGACY_core/discord/resolvePlayerFromButton';
import resolvePlayerFromCommand, {
ResolvedPlayer,
} from '../LEGACY_core/discord/resolvePlayerFromCommand';
import GenericAllStats from '../components/GenericAllStats';
import NoData, { NoDataType } from '../components/NoData';
import TierWeights from '../components/TierWeights';
@@ -23,10 +14,19 @@ import addFilterOptions from '../core/discord/addFilterOptions';
import addUsernameChoices from '../core/discord/addUsernameChoices';
import autocompleteTanks from '../core/discord/autocompleteTanks';
import autocompleteUsername from '../core/discord/autocompleteUsername';
import { buttonRefresh } from '../core/discord/buttonRefresh';
import commandToURL from '../core/discord/commandToURL';
import { getCustomPeriodParams } from '../core/discord/getCustomPeriodParams';
import { getFiltersFromButton } from '../core/discord/getFiltersFromButton';
import { getFiltersFromCommand } from '../core/discord/getFiltersFromCommand';
import resolvePeriodFromButton from '../core/discord/resolvePeriodFromButton';
import resolvePeriodFromCommand, {
ResolvedPeriod,
} from '../core/discord/resolvePeriodFromCommand';
import resolvePlayerFromButton from '../core/discord/resolvePlayerFromButton';
import resolvePlayerFromCommand, {
ResolvedPlayer,
} from '../core/discord/resolvePlayerFromCommand';
import { StatFilters, filterStats } from '../core/statistics/filterStats';
import { getTierWeights } from '../core/statistics/getTierWeights';
import { CommandRegistryRaw } from '../events/interactionCreate';
@@ -91,7 +91,7 @@ export const fullStatsCommand = new Promise<CommandRegistryRaw>(
return Promise.all([
render(player, period, filters),
refreshButton(interaction, path),
buttonRefresh(interaction, path),
getBlitzStarsLinkButton(player.region, player.id),
]);
},
+1 -1
View File
@@ -1,5 +1,4 @@
import { SlashCommandBuilder } from 'discord.js';
import resolveClanFromCommand from '../LEGACY_core/discord/resolveClanFromCommand';
import GenericStats from '../components/GenericStats';
import NoData, { NoDataType } from '../components/NoData';
import TitleBar from '../components/TitleBar';
@@ -8,6 +7,7 @@ import { getAccountInfo } from '../core/blitz/getAccountInfo';
import { getClanInfo } from '../core/blitz/getClanInfo';
import addClanChoices from '../core/discord/addClanChoices';
import autocompleteClan from '../core/discord/autocompleteClan';
import resolveClanFromCommand from '../core/discord/resolveClanFromCommand';
import { CommandRegistry } from '../events/interactionCreate';
const DEFAULT_THRESHOLD = 7;
+1 -1
View File
@@ -1,5 +1,4 @@
import { SlashCommandBuilder } from 'discord.js';
import resolvePlayerFromCommand from '../LEGACY_core/discord/resolvePlayerFromCommand';
import NoData, { NoDataType } from '../components/NoData';
import * as Tanks from '../components/Tanks';
import TitleBar from '../components/TitleBar';
@@ -20,6 +19,7 @@ import {
import addTierChoices from '../core/discord/addTierChoices';
import addUsernameChoices from '../core/discord/addUsernameChoices';
import autocompleteUsername from '../core/discord/autocompleteUsername';
import resolvePlayerFromCommand from '../core/discord/resolvePlayerFromCommand';
import { CommandRegistry } from '../events/interactionCreate';
export const ownedTanksCommand: CommandRegistry = {
+2 -4
View File
@@ -1,15 +1,13 @@
import { SlashCommandBuilder } from 'discord.js';
import { startCase } from 'lodash';
import markdownEscape from 'markdown-escape';
import markdownTable, {
TableInputEntry,
} from '../LEGACY_core/discord/markdownTable';
import resolvePlayerFromCommand from '../LEGACY_core/discord/resolvePlayerFromCommand';
import { getAccountAchievements } from '../core/blitz/getAccountAchievements';
import { getAccountInfo } from '../core/blitz/getAccountInfo';
import addUsernameChoices from '../core/discord/addUsernameChoices';
import autocompleteUsername from '../core/discord/autocompleteUsername';
import embedInfo from '../core/discord/embedInfo';
import markdownTable, { TableInputEntry } from '../core/discord/markdownTable';
import resolvePlayerFromCommand from '../core/discord/resolvePlayerFromCommand';
import { CommandRegistry } from '../events/interactionCreate';
type SortBy = 'name' | 'count';
+2 -2
View File
@@ -1,11 +1,11 @@
import { SlashCommandBuilder } from 'discord.js';
import markdownEscape from 'markdown-escape';
import markdownTable from '../LEGACY_core/discord/markdownTable';
import resolvePlayerFromCommand from '../LEGACY_core/discord/resolvePlayerFromCommand';
import { getAccountInfo } from '../core/blitz/getAccountInfo';
import addUsernameChoices from '../core/discord/addUsernameChoices';
import autocompleteUsername from '../core/discord/autocompleteUsername';
import embedInfo from '../core/discord/embedInfo';
import markdownTable from '../core/discord/markdownTable';
import resolvePlayerFromCommand from '../core/discord/resolvePlayerFromCommand';
import { CommandRegistry } from '../events/interactionCreate';
export const playerInfoCommand: CommandRegistry = {
+2 -2
View File
@@ -5,8 +5,6 @@ import {
SlashCommandSubcommandGroupBuilder,
} from 'discord.js';
import { BlitzkriegRatingsLeaderboard } from '../../scripts/buildRatingsLeaderboard';
import resolvePlayerFromCommand from '../LEGACY_core/discord/resolvePlayerFromCommand';
import { octokit } from '../LEGACY_core/github/octokit';
import throwError from '../LEGACY_core/node/throwError';
import * as Leaderboard from '../components/Leaderboard';
import TitleBar from '../components/TitleBar';
@@ -20,10 +18,12 @@ import getArchivedRatingsInfo from '../core/blitzkrieg/getArchivedRatingsInfo';
import getMidnightLeaderboard, {
DATABASE_REPO,
} from '../core/blitzkrieg/getMidnightLeaderboard';
import { octokit } from '../core/blitzkrieg/octokit';
import addRegionChoices from '../core/discord/addRegionChoices';
import addUsernameChoices from '../core/discord/addUsernameChoices';
import autocompleteUsername from '../core/discord/autocompleteUsername';
import embedNegative from '../core/discord/embedNegative';
import resolvePlayerFromCommand from '../core/discord/resolvePlayerFromCommand';
import { CommandRegistryRaw } from '../events/interactionCreate';
export interface RatingsPlayer {
+10 -10
View File
@@ -1,13 +1,4 @@
import { SlashCommandBuilder } from 'discord.js';
import { refreshButton } from '../LEGACY_core/discord/refreshButton';
import resolvePeriodFromButton from '../LEGACY_core/discord/resolvePeriodFromButton';
import resolvePeriodFromCommand, {
ResolvedPeriod,
} from '../LEGACY_core/discord/resolvePeriodFromCommand';
import resolvePlayerFromButton from '../LEGACY_core/discord/resolvePlayerFromButton';
import resolvePlayerFromCommand, {
ResolvedPlayer,
} from '../LEGACY_core/discord/resolvePlayerFromCommand';
import AllStatsOverview from '../components/AllStatsOverview';
import NoData, { NoDataType } from '../components/NoData';
import TitleBar from '../components/TitleBar';
@@ -22,10 +13,19 @@ import addFilterOptions from '../core/discord/addFilterOptions';
import addUsernameChoices from '../core/discord/addUsernameChoices';
import autocompleteTanks from '../core/discord/autocompleteTanks';
import autocompleteUsername from '../core/discord/autocompleteUsername';
import { buttonRefresh } from '../core/discord/buttonRefresh';
import commandToURL from '../core/discord/commandToURL';
import { getCustomPeriodParams } from '../core/discord/getCustomPeriodParams';
import { getFiltersFromButton } from '../core/discord/getFiltersFromButton';
import { getFiltersFromCommand } from '../core/discord/getFiltersFromCommand';
import resolvePeriodFromButton from '../core/discord/resolvePeriodFromButton';
import resolvePeriodFromCommand, {
ResolvedPeriod,
} from '../core/discord/resolvePeriodFromCommand';
import resolvePlayerFromButton from '../core/discord/resolvePlayerFromButton';
import resolvePlayerFromCommand, {
ResolvedPlayer,
} from '../core/discord/resolvePlayerFromCommand';
import { StatFilters, filterStats } from '../core/statistics/filterStats';
import { CommandRegistryRaw } from '../events/interactionCreate';
@@ -83,7 +83,7 @@ export const statsCommand = new Promise<CommandRegistryRaw>(async (resolve) => {
return Promise.all([
render(player, period, filters),
refreshButton(interaction, path),
buttonRefresh(interaction, path),
getBlitzStarsLinkButton(player.region, player.id),
]);
},
+6 -6
View File
@@ -1,12 +1,12 @@
import { SlashCommandBuilder } from 'discord.js';
import linkButton from '../LEGACY_core/discord/linkButton';
import primaryButton from '../LEGACY_core/discord/primaryButton';
import resolvePlayerFromButton from '../LEGACY_core/discord/resolvePlayerFromButton';
import resolvePlayerFromCommand from '../LEGACY_core/discord/resolvePlayerFromCommand';
import { getAccountInfo } from '../core/blitz/getAccountInfo';
import addUsernameChoices from '../core/discord/addUsernameChoices';
import autocompleteUsername from '../core/discord/autocompleteUsername';
import buttonLink from '../core/discord/buttonLink';
import buttonPrimary from '../core/discord/buttonPrimary';
import commandToURL from '../core/discord/commandToURL';
import resolvePlayerFromButton from '../core/discord/resolvePlayerFromButton';
import resolvePlayerFromCommand from '../core/discord/resolvePlayerFromCommand';
import { CommandRegistry } from '../events/interactionCreate';
import today from '../renderers/today';
@@ -58,9 +58,9 @@ export const todayCommand: CommandRegistry = {
return [
await today(player, cutoff, maximized, showTotal, false),
primaryButton(path, 'Refresh'),
buttonPrimary(path, 'Refresh'),
// linkButton(`https://example.com/${path}`, 'Embed'),
linkButton(
buttonLink(
`https://www.blitzstars.com/player/${player.region}/${nickname}`,
'BlitzStars',
),
+1 -1
View File
@@ -1,6 +1,6 @@
import { AllStats, SupplementaryStats } from '../../core/blitz/getAccountInfo';
import getWN8Percentile from '../../core/statistics/getWN8Percentile';
import isNumber from '../../LEGACY_core/node/isNumber';
import isNumber from '../../core/math/isNumber';
import { Card } from './components/Card';
import { Root } from './components/Root';
import { Row } from './components/Row';
@@ -1,8 +1,8 @@
import { octokit } from '../../LEGACY_core/github/octokit';
import throwError from '../../LEGACY_core/node/throwError';
import { RatingsInfo } from '../../commands/ratings';
import { Region } from '../../constants/regions';
import { DATABASE_REPO } from './getMidnightLeaderboard';
import { octokit } from './octokit';
const ARCHIVED_RATINGS_CACHE: Record<
Region,
File renamed without changes.
@@ -1,6 +1,6 @@
import { BlitzkriegRatingsLeaderboard } from '../../../scripts/buildRatingsLeaderboard';
import { Region } from '../../constants/regions';
import { octokit } from '../../LEGACY_core/github/octokit';
import { octokit } from './octokit';
export const DATABASE_REPO = { owner: 'tresabhi', repo: 'blitzkrieg-db' };
File renamed without changes.
File renamed without changes.
File renamed without changes.
@@ -1,4 +1,4 @@
import { Octokit } from '@octokit/rest';
import { secrets } from '../node/secrets';
import { secrets } from '../../LEGACY_core/node/secrets';
export const octokit = new Octokit({ auth: secrets.GH_TOKEN });
File renamed without changes.
@@ -1,6 +1,6 @@
import linkButton from '../../LEGACY_core/discord/linkButton';
import { Region } from '../../constants/regions';
import { getAccountInfo } from '../blitz/getAccountInfo';
import buttonLink from '../discord/buttonLink';
export async function getBlitzStarsLinkButton(
region: Region,
@@ -9,7 +9,7 @@ export async function getBlitzStarsLinkButton(
) {
const { nickname } = await getAccountInfo(region, id);
return linkButton(
return buttonLink(
`https://www.blitzstars.com/player/${region}/${nickname}${
tankId ? `/tank/${tankId!}` : ''
}`,
@@ -4,7 +4,7 @@ import {
ComponentEmojiResolvable,
} from 'discord.js';
export default function linkButton(
export default function buttonLink(
url: string,
label: string,
emoji?: ComponentEmojiResolvable,
@@ -4,7 +4,7 @@ import {
ComponentEmojiResolvable,
} from 'discord.js';
export default function primaryButton(
export default function buttonPrimary(
id: string,
label: string,
emoji?: ComponentEmojiResolvable,
@@ -1,7 +1,7 @@
import { ChatInputCommandInteraction } from 'discord.js';
import primaryButton from './primaryButton';
import buttonPrimary from './buttonPrimary';
export function refreshButton(
export function buttonRefresh(
interaction: ChatInputCommandInteraction,
path: string,
) {
@@ -9,7 +9,7 @@ export function refreshButton(
interaction.appPermissions?.has('AttachFiles') &&
interaction.appPermissions?.has('ViewChannel')
) {
return primaryButton(path, 'Refresh');
return buttonPrimary(path, 'Refresh');
}
return null;
+3
View File
@@ -4,6 +4,9 @@ export interface Parameters {
[key: string]: string | number | boolean | undefined | null;
}
// TODO: automatically infer command options???
// but how would that work with the region and id options?
export default function commandToURL(
interaction: ChatInputCommandInteraction<CacheType>,
parameters?: Parameters,
File renamed without changes.
@@ -6,7 +6,7 @@ import {
InteractionEditReplyOptions,
} from 'discord.js';
import { InteractionReturnable } from '../../events/interactionCreate';
import jsxToPng from '../node/jsxToPng';
import jsxToPng from '../blitzkrieg/jsxToPng';
export default async function normalizeInteractionReturnable(
returnable: InteractionReturnable,
File renamed without changes.
@@ -1,7 +1,7 @@
import { ChatInputCommandInteraction } from 'discord.js';
import throwError from '../../LEGACY_core/node/throwError';
import { Region } from '../../constants/regions';
import searchClansAcrossRegions from '../../core/blitz/searchClansAcrossRegions';
import throwError from '../node/throwError';
import searchClansAcrossRegions from '../blitz/searchClansAcrossRegions';
import { serverAndIdPattern } from './resolvePlayerFromCommand';
export default async function resolveClanFromCommand(
@@ -1,9 +1,9 @@
import { ButtonInteraction } from 'discord.js';
import { Region } from '../../constants/regions';
import getPeriodNow from '../../core/blitzkrieg/getPeriodNow';
import getPeriodStart from '../../core/blitzkrieg/getPeriodStart';
import getTimeDaysAgo from '../../core/blitzkrieg/getTimeDaysAgo';
import { PeriodType } from '../../core/discord/addPeriodSubCommands';
import getPeriodNow from '../blitzkrieg/getPeriodNow';
import getPeriodStart from '../blitzkrieg/getPeriodStart';
import getTimeDaysAgo from '../blitzkrieg/getTimeDaysAgo';
import { PeriodType } from './addPeriodSubCommands';
import {
ResolvedPeriod,
getPeriodOptionName,
@@ -1,12 +1,9 @@
import { CacheType, ChatInputCommandInteraction } from 'discord.js';
import { Region } from '../../constants/regions';
import getPeriodNow from '../../core/blitzkrieg/getPeriodNow';
import getPeriodStart from '../../core/blitzkrieg/getPeriodStart';
import getTimeDaysAgo from '../../core/blitzkrieg/getTimeDaysAgo';
import {
PeriodSize,
PeriodType,
} from '../../core/discord/addPeriodSubCommands';
import getPeriodNow from '../blitzkrieg/getPeriodNow';
import getPeriodStart from '../blitzkrieg/getPeriodStart';
import getTimeDaysAgo from '../blitzkrieg/getTimeDaysAgo';
import { PeriodSize, PeriodType } from './addPeriodSubCommands';
export function getPeriodOptionName(period: PeriodSize) {
if (period === 'career') return 'Career';
@@ -1,9 +1,9 @@
import { CacheType, ChatInputCommandInteraction } from 'discord.js';
import markdownEscape from 'markdown-escape';
import throwError from '../../LEGACY_core/node/throwError';
import { Region } from '../../constants/regions';
import searchPlayersAcrossRegions from '../../core/blitz/searchPlayersAcrossRegions';
import { getBlitzFromDiscord } from '../../core/blitzkrieg/discordBlitz';
import throwError from '../node/throwError';
import searchPlayersAcrossRegions from '../blitz/searchPlayersAcrossRegions';
import { getBlitzFromDiscord } from '../blitzkrieg/discordBlitz';
export const serverAndIdPattern = /(com|eu|asia)\/[0-9]+/;
File renamed without changes.
@@ -1,7 +1,7 @@
import { ButtonInteraction, CacheType } from 'discord.js';
import { commands } from '..';
import normalizeInteractionReturnable from '../../../LEGACY_core/discord/normalizeInteractionReturnable';
import throwError from '../../../LEGACY_core/node/throwError';
import normalizeInteractionReturnable from '../../../core/discord/normalizeInteractionReturnable';
export default async function handleButton(
interaction: ButtonInteraction<CacheType>,
@@ -7,10 +7,10 @@ import {
} from 'discord.js';
import { commands } from '..';
import discord from '../../../../discord.json' assert { type: 'json' };
import normalizeInteractionReturnable from '../../../LEGACY_core/discord/normalizeInteractionReturnable';
import { psa } from '../../../LEGACY_core/discord/psa';
import { psa } from '../../../core/discord/psa';
import embedNegative from '../../../core/discord/embedNegative';
import embedWarning from '../../../core/discord/embedWarning';
import normalizeInteractionReturnable from '../../../core/discord/normalizeInteractionReturnable';
export default async function handleChatInputCommand(
interaction: ChatInputCommandInteraction<CacheType>,
+2 -2
View File
@@ -14,8 +14,6 @@ import {
SlashCommandSubcommandsOnlyBuilder,
} from 'discord.js';
import discord from '../../../discord.json' assert { type: 'json' };
import getClientId from '../../LEGACY_core/node/getClientId';
import isDev from '../../LEGACY_core/node/isDev';
import { secrets } from '../../LEGACY_core/node/secrets';
import { aboutCommand } from '../../commands/about';
import { debugCommand } from '../../commands/debug';
@@ -34,6 +32,8 @@ import { searchPlayersCommand } from '../../commands/searchPlayers';
import { searchTanksCommand } from '../../commands/searchTanks';
import { statsCommand } from '../../commands/stats';
import { todayCommand } from '../../commands/today';
import getClientId from '../../core/blitzkrieg/getClientId';
import isDev from '../../core/blitzkrieg/isDev';
import handleAutocomplete from './handlers/autocomplete';
import handleButton from './handlers/button';
import handleChatInputCommand from './handlers/chatInputCommand';
+1 -1
View File
@@ -1,5 +1,5 @@
import { Client } from 'discord.js';
import isDev from '../LEGACY_core/node/isDev';
import isDev from '../core/blitzkrieg/isDev';
export default function ready(client: Client<true>) {
console.log(
+1 -1
View File
@@ -1,4 +1,3 @@
import { ResolvedPlayer } from '../LEGACY_core/discord/resolvePlayerFromCommand';
import * as Breakdown from '../components/Breakdown';
import NoData, { NoDataType } from '../components/NoData';
import TitleBar from '../components/TitleBar';
@@ -13,6 +12,7 @@ import getTimeDaysAgo from '../core/blitzkrieg/getTimeDaysAgo';
import getStatsInPeriod from '../core/blitzstars/getStatsInPeriod';
import { tankAverages } from '../core/blitzstars/tankAverages';
import { tankopedia } from '../core/blitzstars/tankopedia';
import { ResolvedPlayer } from '../core/discord/resolvePlayerFromCommand';
import calculateWN8 from '../core/statistics/calculateWN8';
import getWN8Percentile from '../core/statistics/getWN8Percentile';
import sumStats from '../core/statistics/sumStats';