{ "version": 3, "sources": ["../../../../server/tournaments/generator-elimination.ts"], "sourcesContent": ["import {Utils} from '../../lib';\r\n\r\ninterface ElimTree {\r\n\troot: ElimNode;\r\n\tcurrentLayerLeafNodes: ElimNode[];\r\n\tnextLayerLeafNodes: ElimNode[];\r\n}\r\n\r\nimport type {TournamentPlayer} from './index';\r\n\r\n/**\r\n * There are two types of elim nodes, player nodes\r\n * and match nodes.\r\n *\r\n * Player nodes are leaf nodes: .children = none\r\n *\r\n * Match nodes are non-leaf nodes, and will always have two children.\r\n */\r\nclass ElimNode {\r\n\tchildren: [ElimNode, ElimNode] | null;\r\n\t/**\r\n\t * In a player node, the player (null if it's an unfilled loser's bracket node).\r\n\t *\r\n\t * In a match node, the winner if it exists, otherwise null.\r\n\t */\r\n\tuser: TournamentPlayer | null;\r\n\t/**\r\n\t * Only relevant to match nodes. (Player nodes are always '')\r\n\t *\r\n\t * 'available' = ready for battles - will have two children, both with users; this.user is null\r\n\t *\r\n\t * 'finished' = battle already over - will have two children, both with users; this.user is winner\r\n\t *\r\n\t * '' = unavailable\r\n\t */\r\n\tstate: 'available' | 'finished' | '';\r\n\tresult: 'win' | 'loss' | '';\r\n\tscore: number[] | null;\r\n\t/**\r\n\t * Only relevant to match nodes in double+ elimination.\r\n\t *\r\n\t * The loser of this battle will be put in target player node.\r\n\t */\r\n\tlosersBracketNode: ElimNode | null;\r\n\t/**\r\n\t * 0 = winner's bracket\r\n\t * 1 = loser's bracket\r\n\t * 2 = second loser's bracket\r\n\t * etc\r\n\t * (always 0 in single elimination)\r\n\t */\r\n\tlosersBracketIndex: number;\r\n\tparent: ElimNode | null;\r\n\t/**\r\n\t * Only used while building the tree\r\n\t */\r\n\tfromNode: ElimNode | null;\r\n\tconstructor(options: Partial) {\r\n\t\tthis.children = null;\r\n\t\tthis.user = options.user || null;\r\n\t\tthis.state = options.state || '';\r\n\t\tthis.result = options.result || '';\r\n\t\tthis.score = options.score || null;\r\n\t\tthis.losersBracketNode = options.losersBracketNode || null;\r\n\t\tthis.losersBracketIndex = options.losersBracketIndex || 0;\r\n\t\tthis.parent = options.parent || null;\r\n\t\tthis.fromNode = options.fromNode || null;\r\n\t}\r\n\tsetChildren(children: [ElimNode, ElimNode] | null) {\r\n\t\tif (this.children) {\r\n\t\t\tfor (const child of this.children) child.parent = null;\r\n\t\t}\r\n\t\tif (children) {\r\n\t\t\tfor (const child of children) child.parent = this;\r\n\t\t}\r\n\t\tthis.children = children;\r\n\t}\r\n\ttraverse(multiCallback: (node: ElimNode) => void) {\r\n\t\tconst queue: ElimNode[] = [this];\r\n\t\tlet node;\r\n\t\twhile ((node = queue.shift())) {\r\n\t\t\tmultiCallback(node);\r\n\t\t\tif (node.children) queue.push(...node.children);\r\n\t\t}\r\n\t}\r\n\tfind(multiCallback: (node: ElimNode) => (T | void)) {\r\n\t\tconst queue: ElimNode[] = [this];\r\n\t\tlet node;\r\n\t\twhile ((node = queue.shift())) {\r\n\t\t\tconst value = multiCallback(node);\r\n\t\t\tif (value) {\r\n\t\t\t\treturn value;\r\n\t\t\t}\r\n\t\t\tif (node.children) queue.push(...node.children);\r\n\t\t}\r\n\t\treturn undefined;\r\n\t}\r\n\t// eslint-disable-next-line no-restricted-globals\r\n\t[Symbol.iterator]() {\r\n\t\tconst results: ElimNode[] = [this];\r\n\t\tfor (const result of results) {\r\n\t\t\tif (result.children) results.push(...result.children);\r\n\t\t}\r\n\t\t// eslint-disable-next-line no-restricted-globals\r\n\t\treturn results[Symbol.iterator]();\r\n\t}\r\n\ttoJSON() {\r\n\t\tconst node: any = {};\r\n\r\n\t\tif (!this.children) {\r\n\t\t\tnode.team = this.user || (\r\n\t\t\t\tthis.losersBracketIndex <= 1 ? `(loser's bracket)` : `(loser's bracket ${this.losersBracketIndex})`\r\n\t\t\t);\r\n\t\t} else {\r\n\t\t\tnode.children = this.children.map(child => child.toJSON());\r\n\t\t\tnode.state = this.state || 'unavailable';\r\n\t\t\tif (node.state === 'finished') {\r\n\t\t\t\tnode.team = this.user;\r\n\t\t\t\tnode.result = this.result;\r\n\t\t\t\tnode.score = this.score;\r\n\t\t\t}\r\n\t\t}\r\n\r\n\t\treturn node;\r\n\t}\r\n}\r\n\r\nconst nameMap = [\r\n\t\"\",\r\n\t\"Single\",\r\n\t\"Double\",\r\n\t\"Triple\",\r\n\t\"Quadruple\",\r\n\t\"Quintuple\",\r\n\t\"Sextuple\",\r\n\t// Feel free to add more\r\n];\r\n\r\nexport class Elimination {\r\n\treadonly name: string;\r\n\treadonly isDrawingSupported: boolean;\r\n\tisBracketFrozen: boolean;\r\n\tplayers: TournamentPlayer[];\r\n\tmaxSubtrees: number;\r\n\ttreeRoot: ElimNode;\r\n\tconstructor(maxSubtrees: number | string) {\r\n\t\tthis.name = \"Elimination\";\r\n\t\tthis.isDrawingSupported = false;\r\n\t\tthis.isBracketFrozen = false;\r\n\t\tthis.players = [];\r\n\r\n\t\tmaxSubtrees = maxSubtrees || 1;\r\n\t\tif (typeof maxSubtrees === 'string' && maxSubtrees.toLowerCase() === 'infinity') {\r\n\t\t\tmaxSubtrees = Infinity;\r\n\t\t} else if (typeof maxSubtrees !== 'number') {\r\n\t\t\tmaxSubtrees = parseInt(maxSubtrees);\r\n\t\t}\r\n\t\tif (!maxSubtrees || maxSubtrees < 1) maxSubtrees = 1;\r\n\r\n\t\tthis.maxSubtrees = maxSubtrees;\r\n\t\tthis.treeRoot = null!;\r\n\r\n\t\tif (nameMap[maxSubtrees]) {\r\n\t\t\tthis.name = `${nameMap[maxSubtrees]} ${this.name}`;\r\n\t\t} else if (maxSubtrees === Infinity) {\r\n\t\t\tthis.name = `N-${this.name}`;\r\n\t\t} else {\r\n\t\t\tthis.name = `${maxSubtrees}-tuple ${this.name}`;\r\n\t\t}\r\n\t}\r\n\r\n\tgetPendingBracketData(players: TournamentPlayer[]) {\r\n\t\treturn {\r\n\t\t\ttype: 'tree',\r\n\t\t\trootNode: null,\r\n\t\t};\r\n\t}\r\n\tgetBracketData() {\r\n\t\treturn {\r\n\t\t\ttype: 'tree',\r\n\t\t\trootNode: this.treeRoot.toJSON(),\r\n\t\t};\r\n\t}\r\n\tfreezeBracket(players: TournamentPlayer[]) {\r\n\t\tif (!players.length) throw new Error(`No players in tournament`);\r\n\r\n\t\tthis.players = players;\r\n\t\tthis.isBracketFrozen = true;\r\n\r\n\t\t// build the winner's bracket\r\n\t\tlet tree: ElimTree = null!;\r\n\r\n\t\tfor (const user of Utils.shuffle(players)) {\r\n\t\t\tif (!tree) {\r\n\t\t\t\ttree = {\r\n\t\t\t\t\troot: new ElimNode({user}),\r\n\t\t\t\t\tcurrentLayerLeafNodes: [],\r\n\t\t\t\t\tnextLayerLeafNodes: [],\r\n\t\t\t\t};\r\n\t\t\t\ttree.currentLayerLeafNodes.push(tree.root);\r\n\t\t\t\tcontinue;\r\n\t\t\t}\r\n\t\t\tconst targetNode = tree.currentLayerLeafNodes.shift();\r\n\t\t\tif (!targetNode) throw new Error(`TypeScript bug: no ! in checkJs`);\r\n\r\n\t\t\tconst newLeftChild = new ElimNode({user: targetNode.user});\r\n\t\t\ttree.nextLayerLeafNodes.push(newLeftChild);\r\n\r\n\t\t\tconst newRightChild = new ElimNode({user});\r\n\t\t\ttree.nextLayerLeafNodes.push(newRightChild);\r\n\t\t\ttargetNode.setChildren([newLeftChild, newRightChild]);\r\n\r\n\t\t\ttargetNode.user = null;\r\n\r\n\t\t\tif (tree.currentLayerLeafNodes.length === 0) {\r\n\t\t\t\ttree.currentLayerLeafNodes = tree.nextLayerLeafNodes;\r\n\t\t\t\ttree.nextLayerLeafNodes = [];\r\n\t\t\t}\r\n\t\t}\r\n\r\n\t\t// build the loser's brackets, if applicable\r\n\r\n\t\tthis.maxSubtrees = Math.min(this.maxSubtrees, players.length - 1);\r\n\t\tfor (let losersBracketIndex = 1; losersBracketIndex < this.maxSubtrees; losersBracketIndex++) {\r\n\t\t\tconst matchesByDepth: {[depth: number]: ElimNode[]} = {};\r\n\t\t\tconst queue = [{node: tree.root, depth: 0}];\r\n\t\t\tlet frame;\r\n\t\t\twhile ((frame = queue.shift())) {\r\n\t\t\t\tif (!frame.node.children || frame.node.losersBracketNode) continue;\r\n\r\n\t\t\t\tif (!matchesByDepth[frame.depth]) matchesByDepth[frame.depth] = [];\r\n\t\t\t\tmatchesByDepth[frame.depth].push(frame.node);\r\n\r\n\t\t\t\tqueue.push({node: frame.node.children[0], depth: frame.depth + 1});\r\n\t\t\t\tqueue.push({node: frame.node.children[1], depth: frame.depth + 1});\r\n\t\t\t}\r\n\r\n\t\t\tconst newTree: ElimTree = {\r\n\t\t\t\troot: new ElimNode({losersBracketIndex, fromNode: matchesByDepth[0][0]}),\r\n\t\t\t\tcurrentLayerLeafNodes: [],\r\n\t\t\t\tnextLayerLeafNodes: [],\r\n\t\t\t};\r\n\t\t\tnewTree.currentLayerLeafNodes.push(newTree.root);\r\n\r\n\t\t\tfor (const depth in matchesByDepth) {\r\n\t\t\t\tif (depth === '0') continue;\r\n\t\t\t\tconst matchesThisDepth = matchesByDepth[depth];\r\n\t\t\t\tlet n = 0;\r\n\t\t\t\tfor (; n < matchesThisDepth.length - 1; n += 2) {\r\n\t\t\t\t\t// Replace old leaf with:\r\n\t\t\t\t\t// old leaf --+\r\n\t\t\t\t\t// new leaf --+ +-->\r\n\t\t\t\t\t// +--+\r\n\t\t\t\t\t// new leaf --+\r\n\r\n\t\t\t\t\tconst oldLeaf = newTree.currentLayerLeafNodes.shift();\r\n\t\t\t\t\tif (!oldLeaf) throw new Error(`TypeScript bug: no ! in checkJs`);\r\n\t\t\t\t\tconst oldLeafFromNode = oldLeaf.fromNode;\r\n\t\t\t\t\toldLeaf.fromNode = null;\r\n\r\n\t\t\t\t\tconst newBranch = new ElimNode({losersBracketIndex});\r\n\t\t\t\t\toldLeaf.setChildren([new ElimNode({losersBracketIndex, fromNode: oldLeafFromNode}), newBranch]);\r\n\r\n\t\t\t\t\tconst newLeftChild = new ElimNode({losersBracketIndex, fromNode: matchesThisDepth[n]});\r\n\t\t\t\t\tnewTree.nextLayerLeafNodes.push(newLeftChild);\r\n\r\n\t\t\t\t\tconst newRightChild = new ElimNode({losersBracketIndex, fromNode: matchesThisDepth[n + 1]});\r\n\t\t\t\t\tnewTree.nextLayerLeafNodes.push(newRightChild);\r\n\t\t\t\t\tnewBranch.setChildren([newLeftChild, newRightChild]);\r\n\t\t\t\t}\r\n\t\t\t\tif (n < matchesThisDepth.length) {\r\n\t\t\t\t\t// Replace old leaf with:\r\n\t\t\t\t\t// old leaf --+\r\n\t\t\t\t\t// +-->\r\n\t\t\t\t\t// new leaf --+\r\n\r\n\t\t\t\t\tconst oldLeaf = newTree.currentLayerLeafNodes.shift()!;\r\n\t\t\t\t\tconst oldLeafFromNode = oldLeaf.fromNode;\r\n\t\t\t\t\toldLeaf.fromNode = null;\r\n\r\n\t\t\t\t\tconst newLeaf = new ElimNode({fromNode: matchesThisDepth[n]});\r\n\t\t\t\t\tnewTree.nextLayerLeafNodes.push(newLeaf);\r\n\t\t\t\t\toldLeaf.setChildren([new ElimNode({fromNode: oldLeafFromNode}), newLeaf]);\r\n\t\t\t\t}\r\n\r\n\t\t\t\tnewTree.currentLayerLeafNodes = newTree.nextLayerLeafNodes;\r\n\t\t\t\tnewTree.nextLayerLeafNodes = [];\r\n\t\t\t}\r\n\r\n\t\t\tnewTree.root.traverse(node => {\r\n\t\t\t\tif (node.fromNode) {\r\n\t\t\t\t\tnode.fromNode.losersBracketNode = node;\r\n\t\t\t\t\tnode.fromNode = null;\r\n\t\t\t\t}\r\n\t\t\t});\r\n\r\n\t\t\tconst newRoot = new ElimNode({});\r\n\t\t\tnewRoot.setChildren([tree.root, newTree.root]);\r\n\t\t\ttree.root = newRoot;\r\n\t\t}\r\n\r\n\t\ttree.root.traverse(node => {\r\n\t\t\tif (node.children && node.children[0].user && node.children[1].user) {\r\n\t\t\t\tnode.state = 'available';\r\n\t\t\t}\r\n\t\t});\r\n\r\n\t\tthis.treeRoot = tree.root;\r\n\t}\r\n\r\n\tdisqualifyUser(user: TournamentPlayer) {\r\n\t\tif (!this.isBracketFrozen) return 'BracketNotFrozen';\r\n\r\n\t\t/**\r\n\t\t * The user either has a single available battle or no available battles\r\n\t\t */\r\n\t\tconst found = this.treeRoot.find(node => {\r\n\t\t\tif (node.state === 'available') {\r\n\t\t\t\tif (!node.children) throw new Error(`no children`);\r\n\t\t\t\tif (node.children[0].user === user) {\r\n\t\t\t\t\treturn {\r\n\t\t\t\t\t\tmatch: [user, node.children[1].user],\r\n\t\t\t\t\t\tresult: 'loss',\r\n\t\t\t\t\t\tscore: [0, 1],\r\n\t\t\t\t\t};\r\n\t\t\t\t} else if (node.children[1].user === user) {\r\n\t\t\t\t\treturn {\r\n\t\t\t\t\t\tmatch: [node.children[0].user, user],\r\n\t\t\t\t\t\tresult: 'win',\r\n\t\t\t\t\t\tscore: [1, 0],\r\n\t\t\t\t\t};\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t\treturn undefined;\r\n\t\t});\r\n\t\tif (found) {\r\n\t\t\t// @ts-ignore\r\n\t\t\tconst error = this.setMatchResult(found.match, found.result, found.score);\r\n\t\t\tif (error) {\r\n\t\t\t\tthrow new Error(`Unexpected ${error} from setMatchResult([${found.match.join(', ')}], ${found.result})`);\r\n\t\t\t}\r\n\t\t}\r\n\r\n\t\tuser.unlinkUser();\r\n\t}\r\n\r\n\tgetAvailableMatches() {\r\n\t\tif (!this.isBracketFrozen) return 'BracketNotFrozen';\r\n\r\n\t\tconst matches: [TournamentPlayer, TournamentPlayer][] = [];\r\n\t\tthis.treeRoot.traverse(node => {\r\n\t\t\tif (node.state !== 'available') return;\r\n\t\t\tconst p1 = node.children![0].user!;\r\n\t\t\tconst p2 = node.children![1].user!;\r\n\t\t\tif (!p1.isBusy && !p2.isBusy) {\r\n\t\t\t\tmatches.push([p1, p2]);\r\n\t\t\t}\r\n\t\t});\r\n\t\treturn matches;\r\n\t}\r\n\tsetMatchResult([p1, p2]: [TournamentPlayer, TournamentPlayer], result: 'win' | 'loss', score: number[]) {\r\n\t\tif (!this.isBracketFrozen) return 'BracketNotFrozen';\r\n\r\n\t\tif (!['win', 'loss'].includes(result)) return 'InvalidMatchResult';\r\n\r\n\t\tif (!this.players.includes(p1) || !this.players.includes(p2)) return 'UserNotAdded';\r\n\r\n\t\tconst targetNode = this.treeRoot.find(node => {\r\n\t\t\tif (node.state === 'available' && (\r\n\t\t\t\tnode.children![0].user === p1 && node.children![1].user === p2\r\n\t\t\t)) {\r\n\t\t\t\treturn node;\r\n\t\t\t}\r\n\t\t\treturn undefined;\r\n\t\t});\r\n\t\tif (!targetNode) return 'InvalidMatch';\r\n\t\tif (!targetNode.children) throw new Error(`invalid available state`);\r\n\r\n\t\ttargetNode.state = 'finished';\r\n\t\ttargetNode.result = result;\r\n\t\ttargetNode.score = score.slice();\r\n\r\n\t\tconst winner = targetNode.children[result === 'win' ? 0 : 1].user;\r\n\t\tconst loser = targetNode.children[result === 'loss' ? 0 : 1].user;\r\n\t\ttargetNode.user = winner;\r\n\t\tif (!winner || !loser) throw new Error(`invalid available state`);\r\n\r\n\t\tif (loser.losses === this.maxSubtrees) {\r\n\t\t\tloser.isEliminated = true;\r\n\t\t\tloser.sendRoom(`|tournament|update|{\"isJoined\":false}`);\r\n\t\t\tloser.unlinkUser();\r\n\t\t}\r\n\r\n\t\tif (targetNode.parent) {\r\n\t\t\tconst parent = targetNode.parent;\r\n\r\n\t\t\tif (loser.losses <= winner.losses && !loser.isDisqualified) {\r\n\t\t\t\t// grand subfinals rematch\r\n\t\t\t\tconst newNode = new ElimNode({state: 'available', losersBracketNode: targetNode.losersBracketNode});\r\n\t\t\t\tnewNode.setChildren([targetNode, new ElimNode({user: loser})]);\r\n\t\t\t\tparent.setChildren([newNode, parent.children![1]]);\r\n\t\t\t\treturn;\r\n\t\t\t}\r\n\t\t\tconst userA = parent.children![0].user;\r\n\t\t\tconst userB = parent.children![1].user;\r\n\t\t\tif (userA && userB) {\r\n\t\t\t\tparent.state = 'available';\r\n\r\n\t\t\t\tlet error: string | undefined = '';\r\n\t\t\t\tif (userA.isDisqualified) {\r\n\t\t\t\t\terror = this.setMatchResult([userA, userB], 'loss', [0, 1]);\r\n\t\t\t\t} else if (userB.isDisqualified) {\r\n\t\t\t\t\terror = this.setMatchResult([userA, userB], 'win', [1, 0]);\r\n\t\t\t\t}\r\n\r\n\t\t\t\tif (error) {\r\n\t\t\t\t\tthrow new Error(`Unexpected ${error} from setMatchResult([${userA},${userB}], ...)`);\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t} else if (loser.losses < this.maxSubtrees && !loser.isDisqualified) {\r\n\t\t\tconst newRoot = new ElimNode({state: 'available'});\r\n\t\t\tnewRoot.setChildren([targetNode, new ElimNode({user: loser})]);\r\n\t\t\tthis.treeRoot = newRoot;\r\n\t\t}\r\n\r\n\t\tif (targetNode.losersBracketNode) {\r\n\t\t\ttargetNode.losersBracketNode.user = loser;\r\n\t\t\tconst userA = targetNode.losersBracketNode.parent!.children![0].user;\r\n\t\t\tconst userB = targetNode.losersBracketNode.parent!.children![1].user;\r\n\t\t\tif (userA && userB) {\r\n\t\t\t\ttargetNode.losersBracketNode.parent!.state = 'available';\r\n\r\n\t\t\t\tlet error: string | undefined = '';\r\n\t\t\t\tif (userA.isDisqualified) {\r\n\t\t\t\t\terror = this.setMatchResult([userA, userB], 'loss', [0, 1]);\r\n\t\t\t\t} else if (userB.isDisqualified) {\r\n\t\t\t\t\terror = this.setMatchResult([userA, userB], 'win', [1, 0]);\r\n\t\t\t\t}\r\n\r\n\t\t\t\tif (error) {\r\n\t\t\t\t\tthrow new Error(`Unexpected ${error} from setMatchResult([${userA}, ${userB}], ...)`);\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t}\r\n\t}\r\n\r\n\tisTournamentEnded() {\r\n\t\treturn this.treeRoot.state === 'finished';\r\n\t}\r\n\r\n\tgetResults() {\r\n\t\tif (!this.isTournamentEnded()) return 'TournamentNotEnded';\r\n\r\n\t\tconst results = [];\r\n\t\tlet currentNode = this.treeRoot;\r\n\t\tfor (let n = 0; n < this.maxSubtrees; ++n) {\r\n\t\t\tresults.push([currentNode.user]);\r\n\r\n\t\t\tif (!currentNode.children) break;\r\n\t\t\tcurrentNode = currentNode.children[currentNode.result === 'loss' ? 0 : 1];\r\n\t\t\tif (!currentNode) break;\r\n\t\t}\r\n\r\n\t\tif (this.players.length - 1 === this.maxSubtrees && currentNode) {\r\n\t\t\tresults.push([currentNode.user]);\r\n\t\t}\r\n\r\n\t\treturn results;\r\n\t}\r\n}\r\n"], "mappings": "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", "names": [] }