From fd24c22a28ff812f5d9d97b1889fe3aa33d25054 Mon Sep 17 00:00:00 2001 From: "Kalle (Sendou)" <38327916+Sendouc@users.noreply.github.com> Date: Sat, 12 Jun 2021 20:52:13 +0300 Subject: [PATCH] Team Splitter first public version --- hooks/8s/index.ts | 162 ----------------------- hooks/{8s => team-splitter}/helpers.ts | 98 +++++++++++--- hooks/team-splitter/index.ts | 171 +++++++++++++++++++++++++ hooks/{8s => team-splitter}/types.ts | 34 ++--- pages/{8s.tsx => team-splitter.tsx} | 138 ++++++++++++++++++-- public/layout/team-splitter.png | Bin 0 -> 34211 bytes utils/constants.ts | 1 + 7 files changed, 393 insertions(+), 211 deletions(-) delete mode 100644 hooks/8s/index.ts rename hooks/{8s => team-splitter}/helpers.ts (61%) create mode 100644 hooks/team-splitter/index.ts rename hooks/{8s => team-splitter}/types.ts (55%) rename pages/{8s.tsx => team-splitter.tsx} (50%) create mode 100644 public/layout/team-splitter.png diff --git a/hooks/8s/index.ts b/hooks/8s/index.ts deleted file mode 100644 index 0c8416297..000000000 --- a/hooks/8s/index.ts +++ /dev/null @@ -1,162 +0,0 @@ -import { useReducer } from "react"; -import { shuffleArray } from "utils/arrays"; -import { createNewMatch, teamsShouldChange } from "./helpers"; - -const MU_DEFAULT_VALUE = 0; -const SIGMA_DEFAULT_VALUE = 0; -const DEFAULT_AMOUNT_OF_ROUNDS_WITH_SAME_TEAMS = 2; - -export const useEightsPage = () => { - const [state, dispatch] = useReducer( - (oldState: State, action: Action) => { - switch (action.type) { - case "SET_PLAYER": - const newPlayers = [...oldState.players]; - newPlayers[action.number - 1] = { - ...newPlayers[action.number - 1], - name: action.name, - }; - - return { ...oldState, players: newPlayers as State["players"] }; - case "SET_AMOUNT_OF_ROUNDS_WITH_SAME_TEAMS": - return { - ...oldState, - amountOfRoundsWithSameTeams: action.amountOfRoundsWithSameTeams, - }; - case "CREATE_FIRST_MATCH": - const newMatch = createNewMatch({ - players: oldState.players, - previousMatches: oldState.matches, - sittingOutCounts: new Map(), - }); - - window.scrollTo(0, 0); - - return { ...oldState, matches: [...oldState.matches, newMatch] }; - case "SET_WINNER": - const matches = [...oldState.matches]; - matches[matches.length - 1].winner = action.winner; - - const alphaPlayersSet = new Set(matches[matches.length - 1].alpha); - const bravoPlayersSet = new Set(matches[matches.length - 1].bravo); - - const players = [...oldState.players].map((player) => { - let winCount = player.winCount; - if (alphaPlayersSet.has(player.name) && action.winner === "alpha") - winCount++; - else if ( - bravoPlayersSet.has(player.name) && - action.winner === "bravo" - ) - winCount++; - - let lossCount = player.lossCount; - if (alphaPlayersSet.has(player.name) && action.winner === "bravo") - lossCount++; - else if ( - bravoPlayersSet.has(player.name) && - action.winner === "alpha" - ) - lossCount++; - return { - ...player, - winCount, - lossCount, - }; - }); - - const newMatchAfterSettingWinner = teamsShouldChange({ - amountOfRoundsWithSameTeams: oldState.amountOfRoundsWithSameTeams, - matchesLength: oldState.matches.length, - }) - ? createNewMatch({ - players, - previousMatches: matches, - sittingOutCounts: new Map(), - }) - : { - ...oldState.matches[oldState.matches.length - 1], - winner: undefined, - }; - - matches.push(newMatchAfterSettingWinner); - - return { ...oldState, matches, players }; - default: - return oldState; - } - }, - { - players: [ - { - id: 1, - name: "Sendou", - mu: MU_DEFAULT_VALUE, - sigma: SIGMA_DEFAULT_VALUE, - winCount: 0, - lossCount: 0, - }, - { - id: 2, - name: "Kiver", - mu: MU_DEFAULT_VALUE, - sigma: SIGMA_DEFAULT_VALUE, - winCount: 0, - lossCount: 0, - }, - { - id: 3, - name: "Brian", - mu: MU_DEFAULT_VALUE, - sigma: SIGMA_DEFAULT_VALUE, - winCount: 0, - lossCount: 0, - }, - { - id: 4, - name: "Sorin", - mu: MU_DEFAULT_VALUE, - sigma: SIGMA_DEFAULT_VALUE, - winCount: 0, - lossCount: 0, - }, - { - id: 5, - name: "DUDE", - mu: MU_DEFAULT_VALUE, - sigma: SIGMA_DEFAULT_VALUE, - winCount: 0, - lossCount: 0, - }, - { - id: 6, - name: "Grey", - mu: MU_DEFAULT_VALUE, - sigma: SIGMA_DEFAULT_VALUE, - winCount: 0, - lossCount: 0, - }, - { - id: 7, - name: "plontro", - mu: MU_DEFAULT_VALUE, - sigma: SIGMA_DEFAULT_VALUE, - winCount: 0, - lossCount: 0, - }, - { - id: 8, - name: "Kaldemar", - mu: MU_DEFAULT_VALUE, - sigma: SIGMA_DEFAULT_VALUE, - winCount: 0, - lossCount: 0, - }, - ], - matches: [], - amountOfRoundsWithSameTeams: DEFAULT_AMOUNT_OF_ROUNDS_WITH_SAME_TEAMS, - } - ); - - return { state, dispatch }; -}; diff --git a/hooks/8s/helpers.ts b/hooks/team-splitter/helpers.ts similarity index 61% rename from hooks/8s/helpers.ts rename to hooks/team-splitter/helpers.ts index 99ed1fd8a..eaed4fb07 100644 --- a/hooks/8s/helpers.ts +++ b/hooks/team-splitter/helpers.ts @@ -1,16 +1,29 @@ import { shuffleArray } from "utils/arrays"; -const choosePlayersToSitOut = ({ - players, - sittingOutCounts, -}: { - players: Players; - sittingOutCounts: SittingOutCounts; -}): PlayersTeam => { - if (players.length === 8) return players as PlayersTeam; +const choosePlayersToSitOut = ( + players: Player[] +): [playingRoster: Player[], spectators: Player[]] => { + if (players.length === 8) return [players, []]; - // TODO: cut down to 8 - return players as PlayersTeam; + console.log("players", players); + + const playersCopySorted = [...players].sort( + (a, b) => a.sittingOutCount - b.sittingOutCount + ); + + const playingRoster: Player[] = []; + const spectators: Player[] = []; + + for (const [i, player] of playersCopySorted.entries()) { + if (i === 0) spectators.push(player); + else if (i === 1 && playersCopySorted.length === 10) { + spectators.push(player); + } else { + playingRoster.push(player); + } + } + + return [playingRoster, spectators]; }; const getAllSubsetsOfSizeFour = (theArray: T[]): T[][] => @@ -66,8 +79,6 @@ const removeTeamsThatAlreadyPlayed = ({ }): Player[][] => { const result: Player[][] = []; - console.log("previousMatches", previousMatches); - for (const team of teams) { let isNewTeam = true; const teamSortedStringified = team @@ -92,6 +103,39 @@ const removeTeamsThatAlreadyPlayed = ({ return result; }; +const removeTeamsWherePlayersShouldNotBeInTheSameTeam = ({ + teams, + noPlacingToSameTeam, + players, +}: { + teams: Player[][]; + noPlacingToSameTeam: [playerOneId?: number, playerTwoId?: number]; + players: Player[]; +}): Player[][] => { + if (noPlacingToSameTeam.length !== 2) return teams; + + // Check if one or both of the unpreferred players are spectating + if ( + players.reduce( + (count, player) => + noPlacingToSameTeam.includes(player.id) ? count + 1 : count, + 0 + ) !== 2 + ) { + return teams; + } + // If count is not one it means the unpreferred players are either both in this team (count 2) + // or in the other team (count 2) + return teams.filter( + (t) => + t.reduce( + (count, player) => + noPlacingToSameTeam.includes(player.id) ? count + 1 : count, + 0 + ) === 1 + ); +}; + const selectAlphaTeamOfBestProjectedMatchUp = ({ teams, players, @@ -135,19 +179,24 @@ const selectAlphaTeamOfBestProjectedMatchUp = ({ export const createNewMatch = ({ players, previousMatches, - sittingOutCounts, + noPlacingToSameTeam, }: { - players: Players; + players: Player[]; previousMatches: Match[]; - sittingOutCounts: SittingOutCounts; + noPlacingToSameTeam: [playerOneId?: number, playerTwoId?: number]; }): Match => { // TODO: who sits out has to also be recorded - const playersForMatch = shuffleArray( - choosePlayersToSitOut({ players, sittingOutCounts }) + const [playersForMatch, spectators] = choosePlayersToSitOut( + shuffleArray(players) ); let teams = getAllSubsetsOfSizeFour(playersForMatch); teams = removeDuplicates({ teams, players: playersForMatch }); teams = removeTeamsThatAlreadyPlayed({ teams, previousMatches }); + teams = removeTeamsWherePlayersShouldNotBeInTheSameTeam({ + teams, + noPlacingToSameTeam, + players: playersForMatch, + }); const alpha = selectAlphaTeamOfBestProjectedMatchUp({ teams, @@ -156,7 +205,7 @@ export const createNewMatch = ({ const bravo = playersForMatch .filter((player) => !alpha.includes(player.name)) .map((p) => p.name); - return { alpha, bravo }; + return { alpha, bravo, spectators: spectators.map((s) => s.name) }; }; export const teamsShouldChange = ({ @@ -168,3 +217,16 @@ export const teamsShouldChange = ({ }) => { return matchesLength % amountOfRoundsWithSameTeams === 0; }; + +export const errorWithPlayers = (players: Player[]) => { + const playerNames = players + .map((p) => p.name.trim()) + .filter((name) => name !== ""); + if (playerNames.length < 8) return "Please enter at least 8 player names"; + + const uniqueNames = new Set(playerNames.map((name) => name.toUpperCase())); + if (uniqueNames.size !== playerNames.length) + return "Every name has to be unique"; + + return ""; +}; diff --git a/hooks/team-splitter/index.ts b/hooks/team-splitter/index.ts new file mode 100644 index 000000000..27c025452 --- /dev/null +++ b/hooks/team-splitter/index.ts @@ -0,0 +1,171 @@ +import { useEffect, useReducer } from "react"; +import { createNewMatch, teamsShouldChange, errorWithPlayers } from "./helpers"; + +const DEFAULT_AMOUNT_OF_ROUNDS_WITH_SAME_TEAMS = 2; + +const getInitialState = (ignoreLocalStorage: boolean = false): State => { + const stateFromLocalStorage = JSON.parse( + window.localStorage.getItem("team-splitter-state") ?? "{}" + ); + if ( + !ignoreLocalStorage && + stateFromLocalStorage && + Object.keys(stateFromLocalStorage).length > 0 + ) { + return stateFromLocalStorage; + } + return { + players: new Array(10).fill(null).map((_, i) => ({ + id: i + 1, + name: "", + winCount: 0, + lossCount: 0, + sittingOutCount: 0, + })), + matches: [], + amountOfRoundsWithSameTeams: DEFAULT_AMOUNT_OF_ROUNDS_WITH_SAME_TEAMS, + errorWithPlayers: "", + noPlacingToSameTeam: [], + }; +}; + +export const useTeamSplitterPage = () => { + const [state, dispatch] = useReducer((oldState: State, action: Action) => { + switch (action.type) { + case "SET_PLAYER": + const newPlayers = [...oldState.players]; + newPlayers[action.number - 1] = { + ...newPlayers[action.number - 1], + name: action.name, + }; + + return { + ...oldState, + players: newPlayers as State["players"], + errorWithPlayers: errorWithPlayers(newPlayers), + }; + case "SET_NO_PLACING_TO_SAME_TEAM": + return { + ...oldState, + noPlacingToSameTeam: action.checked + ? oldState.noPlacingToSameTeam.concat(action.id) + : (oldState.noPlacingToSameTeam.filter( + (id) => id !== action.id + ) as any), + }; + case "SET_AMOUNT_OF_ROUNDS_WITH_SAME_TEAMS": + return { + ...oldState, + amountOfRoundsWithSameTeams: action.amountOfRoundsWithSameTeams, + }; + case "CREATE_FIRST_MATCH": + const playersCleanedUp = oldState.players + .filter((p) => p.name !== "") + .map((p) => ({ ...p, name: p.name.trim() })); + const newMatch = createNewMatch({ + players: playersCleanedUp, + previousMatches: oldState.matches, + noPlacingToSameTeam: oldState.noPlacingToSameTeam, + }); + + window.scrollTo(0, 0); + + return { + ...oldState, + matches: [...oldState.matches, newMatch], + players: playersCleanedUp, + }; + case "SET_WINNER": + const matches = [...oldState.matches]; + matches[matches.length - 1].winner = action.winner; + + const alphaPlayersSet = new Set(matches[matches.length - 1].alpha); + const bravoPlayersSet = new Set(matches[matches.length - 1].bravo); + + const players = [...oldState.players].map((player) => { + let winCount = player.winCount; + if ( + !alphaPlayersSet.has(player.name) && + !bravoPlayersSet.has(player.name) + ) { + return { ...player, sittingOutCount: player.sittingOutCount + 1 }; + } + if (alphaPlayersSet.has(player.name) && action.winner === "alpha") + winCount++; + else if ( + bravoPlayersSet.has(player.name) && + action.winner === "bravo" + ) + winCount++; + + let lossCount = player.lossCount; + if (alphaPlayersSet.has(player.name) && action.winner === "bravo") + lossCount++; + else if ( + bravoPlayersSet.has(player.name) && + action.winner === "alpha" + ) + lossCount++; + return { + ...player, + winCount, + lossCount, + }; + }); + + const newMatchAfterSettingWinner = teamsShouldChange({ + amountOfRoundsWithSameTeams: oldState.amountOfRoundsWithSameTeams, + matchesLength: oldState.matches.length, + }) + ? createNewMatch({ + players, + previousMatches: matches, + noPlacingToSameTeam: oldState.noPlacingToSameTeam, + }) + : { + ...oldState.matches[oldState.matches.length - 1], + winner: undefined, + }; + + matches.push(newMatchAfterSettingWinner); + + return { ...oldState, matches, players }; + case "UNDO_LATEST_MATCH": + // oldState.matches[oldState.matches.length-1] is the match that is currently in progress + const lastFinishedMatch = oldState.matches[oldState.matches.length - 2]; + const adjustedPlayers = oldState.players.map((p) => { + if (lastFinishedMatch.spectators.includes(p.name)) { + return { ...p, sittingOutCount: p.sittingOutCount - 1 }; + } + if (lastFinishedMatch[lastFinishedMatch.winner!].includes(p.name)) { + return { ...p, winCount: p.winCount - 1 }; + } + + return { ...p, lossCount: p.lossCount - 1 }; + }); + + const adjustedMatches = oldState.matches + .slice(0, oldState.matches.length - 1) + .map((match, i, arr) => + i === arr.length - 1 ? { ...match, winner: undefined } : match + ); + + return { + ...oldState, + players: adjustedPlayers, + matches: adjustedMatches, + }; + case "RESET": + window.scroll(0, 0); + return getInitialState(true); + default: + return oldState; + } + }, getInitialState()); + + useEffect(() => { + window.localStorage.setItem("team-splitter-state", JSON.stringify(state)); + }, [state]); + + return { state, dispatch }; +}; diff --git a/hooks/8s/types.ts b/hooks/team-splitter/types.ts similarity index 55% rename from hooks/8s/types.ts rename to hooks/team-splitter/types.ts index d4dc8e43f..7058a39c3 100644 --- a/hooks/8s/types.ts +++ b/hooks/team-splitter/types.ts @@ -1,33 +1,24 @@ interface Player { id: number; name: string; - mu: number; - sigma: number; winCount: number; lossCount: number; + sittingOutCount: number; } -type Players = Player[]; - -type PlayersTeam = [ - Player, - Player, - Player, - Player, - Player, - Player, - Player, - Player -]; - -type SittingOutCounts = Map; - -type Match = { alpha: string[]; bravo: string[]; winner?: "alpha" | "bravo" }; +type Match = { + alpha: string[]; + bravo: string[]; + spectators: string[]; + winner?: "alpha" | "bravo"; +}; interface State { - players: Players; + players: Player[]; matches: Match[]; amountOfRoundsWithSameTeams: number; + errorWithPlayers: string; + noPlacingToSameTeam: [playerOneId?: number, playerTwoId?: number]; } // TODO: names must be unique @@ -43,4 +34,7 @@ type Action = | { type: "SET_AMOUNT_OF_ROUNDS_WITH_SAME_TEAMS"; amountOfRoundsWithSameTeams: number; - }; + } + | { type: "UNDO_LATEST_MATCH" } + | { type: "RESET" } + | { type: "SET_NO_PLACING_TO_SAME_TEAM"; id: number; checked: boolean }; diff --git a/pages/8s.tsx b/pages/team-splitter.tsx similarity index 50% rename from pages/8s.tsx rename to pages/team-splitter.tsx index 98bc40bb5..bf0515b97 100644 --- a/pages/8s.tsx +++ b/pages/team-splitter.tsx @@ -1,9 +1,10 @@ import { Button } from "@chakra-ui/button"; +import { Checkbox } from "@chakra-ui/checkbox"; import { Input } from "@chakra-ui/input"; -import { Box, Grid, Stack, Text } from "@chakra-ui/layout"; +import { Box, Flex, Grid, Stack, Text } from "@chakra-ui/layout"; import { Radio, RadioGroup } from "@chakra-ui/radio"; import NewTable from "components/common/NewTable"; -import { useEightsPage } from "hooks/8s"; +import { useTeamSplitterPage } from "hooks/team-splitter"; import { Fragment } from "react"; const winLossRatio = ({ @@ -21,15 +22,15 @@ const winLossRatio = ({ return [`${prefix}${ratio}`, ratio]; }; -const EightsPage = () => { - const { state, dispatch } = useEightsPage(); +const TeamSplitterPage = () => { + const { state, dispatch } = useTeamSplitterPage(); return ( <> {state.matches.length === 0 ? ( <> - {new Array(8).fill(null).map((_, i) => { + {new Array(10).fill(null).map((_, i) => { return ( { - + + + Choose 2 players that should never be placed in the same team + (optional) + + + dispatch({ + type: "SET_AMOUNT_OF_ROUNDS_WITH_SAME_TEAMS", + amountOfRoundsWithSameTeams: Number(value), + }) + } + value={String(state.amountOfRoundsWithSameTeams)} + > + + {state.players + .filter((p) => p.name !== "") + .map((p) => ( + + dispatch({ + type: "SET_NO_PLACING_TO_SAME_TEAM", + id: p.id, + checked: e.target.checked, + }) + } + > + {p.name} + + ))} + + + + + + + {state.errorWithPlayers} + + ) : ( <> { > Bravo + + Spectators + {state.matches[state.matches.length - 1].alpha.map((player, i) => { return ( @@ -119,12 +184,19 @@ const EightsPage = () => { {state.matches[state.matches.length - 1].bravo[i]} + + {state.matches[state.matches.length - 1].spectators[i] ?? + ""} + ); })} + {state.matches.length > 1 ? ( + + ) : null} + { ratio: winLossRatio(player)[0], }))} /> + )} ); }; -export default EightsPage; +export default TeamSplitterPage; diff --git a/public/layout/team-splitter.png b/public/layout/team-splitter.png new file mode 100644 index 0000000000000000000000000000000000000000..6a7d98a2ca78edaf81be3141b9608e7bb28ca8f7 GIT binary patch literal 34211 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 literal 0 HcmV?d00001 diff --git a/utils/constants.ts b/utils/constants.ts index ce5c15322..4077ba14b 100644 --- a/utils/constants.ts +++ b/utils/constants.ts @@ -47,6 +47,7 @@ export const navItems: { { code: "t", name: "Teams" }, { code: "plans", name: "Plans" }, { code: "maps", name: "Map Lists" }, + { code: "team-splitter", name: "Team Splitter" }, { code: "plus", name: "Plus Server",