Merge branch 'release/v2.1.6'

This commit is contained in:
zkldi
2022-03-11 15:10:25 +00:00
18 changed files with 63 additions and 208 deletions
+12
View File
@@ -15,6 +15,18 @@ not generally be shown to end users.
# Changelog
# 2.1.2
- [INTERNAL_ENH] Keys no longer *ever* use random ids. This was a fundamental misunderstanding of react on my part.
*****
- [BUG] The tierlist viewer no longer crashes if a change causes a bucket to be empty.
# 2.1.1
- [BUG] USC Searches no longer display (undefined) next to them.
## 2.1.0
- [FEAT] Added UI support for Jubeat, Pop'n, WACCA and PMS.
+2 -2
View File
@@ -1,6 +1,6 @@
{
"name": "tachi-client",
"version": "2.1.5",
"version": "2.1.6",
"private": true,
"scripts": {
"start": "node scripts/start.js -o",
@@ -86,7 +86,7 @@
"rg-stats": "^0.2.0",
"socicon": "3.0.5",
"sync-fetch": "^0.3.1",
"tachi-common": "0.5.15"
"tachi-common": "0.6.7"
},
"devDependencies": {
"@types/humanize-duration": "3.25.1",
+13 -144
View File
@@ -88,7 +88,7 @@ specifiers:
socicon: 3.0.5
style-loader: 1.0.0
sync-fetch: ^0.3.1
tachi-common: 0.5.15
tachi-common: 0.6.7
terser-webpack-plugin: 1.4.1
ts-pnp: 1.1.4
typescript: 4.3.5
@@ -164,7 +164,7 @@ dependencies:
rg-stats: 0.2.0
socicon: 3.0.5
sync-fetch: 0.3.1
tachi-common: 0.5.15
tachi-common: 0.6.7
devDependencies:
'@types/humanize-duration': 3.25.1
@@ -3050,8 +3050,8 @@ packages:
resolution: {integrity: sha512-eC4U9MlIcu2q0KQmXszyn5Akca/0jrQmwDRgpAMJai7qBWq4amIQhZyNau4VYGtCeALvW1/NtjzJJ567aZxfKA==}
dev: false
/@types/mongodb/3.6.20:
resolution: {integrity: sha512-WcdpPJCakFzcWWD9juKoZbRtQxKIMYF/JIAM4JrNHrMcnJL6/a2NWjXxW7fo9hxboxxkg+icff8d7+WIEvKgYQ==}
/@types/mongodb/3.6.18:
resolution: {integrity: sha512-JSVFt9p0rTfZ4EgzXmVHUB3ue00xe3CRbQho8nXfImzEDDM4O7I3po1bwbWl/EIbLENxUreZxqLOc8lvcnLVPA==}
dependencies:
'@types/bson': 4.2.0
'@types/node': 16.0.0
@@ -3953,13 +3953,6 @@ packages:
dev: true
optional: true
/bl/2.2.1:
resolution: {integrity: sha512-6Pesp1w0DEX1N550i/uGV/TqucVL4AM/pgThFSN/Qq9si1/DF9aIHs1BxD8V/QU0HoeHO6cQRTAuYnLPKq1e4g==}
dependencies:
readable-stream: 2.3.7
safe-buffer: 5.2.1
dev: false
/bluebird/3.7.2:
resolution: {integrity: sha512-XpNj6GDQzdfW+r2Wnn7xiSAd7TM3jzkxGXBGTtWKuSXv1xUV+azxAm8jdWZN06QTQk+2N2XB9jRDkvbmQmcRtg==}
dev: true
@@ -4143,11 +4136,6 @@ packages:
node-releases: 1.1.75
dev: true
/bson/1.1.6:
resolution: {integrity: sha512-EvVNVeGo4tHxwi8L6bPj3y3itEvStdwvvlojVxxbyYfoaxJ6keLgrTuKdyfEAszFK+H3olzBuafE0yoh0D1gdg==}
engines: {node: '>=0.6.19'}
dev: false
/bson/4.5.1:
resolution: {integrity: sha512-XqFP74pbTVLyLy5KFxVfTUyRrC1mgOlmu/iXHfXqfCKT59jyP9lwbotGfbN59cHBRbJSamZNkrSopjv+N0SqAA==}
engines: {node: '>=6.9.0'}
@@ -4738,6 +4726,7 @@ packages:
/core-util-is/1.0.2:
resolution: {integrity: sha1-tf1UIgqivFq1eqtxQMlAdUUDwac=}
dev: true
/cosmiconfig/5.2.1:
resolution: {integrity: sha512-H65gsXo1SKjf8zmrJ67eJk8aIRKV5ff2D4uKZIBZShbhGSpEmsQOPW/SKMKYhSTrqR7ufy6RP69rPogdaPh/kA==}
@@ -5277,11 +5266,6 @@ packages:
resolution: {integrity: sha512-WNPWi1IRKZfCt/qIDMfERkDp93+iZEmOxN2yy4Jg+Xhv8SLk2UTqqbe1sfiipn0and9QrE914/ihdx82Y/Giag==}
dev: false
/denque/1.5.1:
resolution: {integrity: sha512-XwE+iZ4D6ZUB7mfYRMb5wByE8L74HCn30FBN7sWnXksWc1LO1bPDl67pBR9o/kC4z/xSNAwkMYcGgqDV3BE3Hw==}
engines: {node: '>=0.10'}
dev: false
/depd/1.1.2:
resolution: {integrity: sha1-m81S4UwJd2PnSbJ0xDRu0uVgtak=}
engines: {node: '>= 0.6'}
@@ -7370,6 +7354,7 @@ packages:
/isarray/1.0.0:
resolution: {integrity: sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=}
dev: true
/isexe/2.0.0:
resolution: {integrity: sha1-6PvzdNxVb/iUehDcsFctYz8s+hA=}
@@ -7929,11 +7914,6 @@ packages:
readable-stream: 2.3.7
dev: true
/memory-pager/1.5.0:
resolution: {integrity: sha512-ZS4Bp4r/Zoeq6+NLJpP+0Zzm0pR8whtGPf1XExKLJBAczGMnSi3It14OiNCStjQjM6NU1okjQGSxgEZN8eBYKg==}
dev: false
optional: true
/merge-deep/3.0.3:
resolution: {integrity: sha512-qtmzAS6t6grwEkNrunqTBdn0qKwFgNWvlxUbAV8es9M7Ot1EbyApytCnvE0jALPa46ZpKDUo527kKiaWplmlFA==}
engines: {node: '>=0.10.0'}
@@ -8298,86 +8278,6 @@ packages:
dependencies:
minimist: 1.2.5
/mongodb/3.7.0:
resolution: {integrity: sha512-JOAYjT9WYeRFkIP6XtDidAr3qvpfLRJhT2iokRWWH0tgqCQr9kmSfOJBZ3Ry0E5A3EqKxVPVhN3MV8Gn03o7pA==}
engines: {node: '>=4'}
peerDependencies:
aws4: '*'
bson-ext: '*'
kerberos: '*'
mongodb-client-encryption: '*'
mongodb-extjson: '*'
snappy: '*'
peerDependenciesMeta:
aws4:
optional: true
bson-ext:
optional: true
kerberos:
optional: true
mongodb-client-encryption:
optional: true
mongodb-extjson:
optional: true
snappy:
optional: true
dependencies:
bl: 2.2.1
bson: 1.1.6
denque: 1.5.1
optional-require: 1.1.7
safe-buffer: 5.2.1
optionalDependencies:
saslprep: 1.0.3
dev: false
/monk-middleware-cast-ids/0.2.1:
resolution: {integrity: sha1-QMQOWmyzPM7cKJIglDJ17ohhxSk=}
dev: false
/monk-middleware-fields/0.2.0:
resolution: {integrity: sha1-/2N6819ZSIecyyvhWpE2CRG+psE=}
dev: false
/monk-middleware-handle-callback/0.2.2:
resolution: {integrity: sha512-5hBynb7asZ2uw9XVze7C3XH0zXT51yFDvYydk/5HnWWzh2NLglDSiKDcX0yLKPHzFgiq+5Z4Laq5fFVnFsmm8w==}
dev: false
/monk-middleware-options/0.2.1:
resolution: {integrity: sha1-WNrhxRjUZjbr3/UG+t/Hc7tEKIY=}
dev: false
/monk-middleware-query/0.2.0:
resolution: {integrity: sha1-qSbGd9SlYgxiFRsKVtDAwVFnWHQ=}
dev: false
/monk-middleware-wait-for-connection/0.2.0:
resolution: {integrity: sha1-MSlY0w5Yi1fQl1TdfJe0hDMWg1o=}
dev: false
/monk/7.3.4:
resolution: {integrity: sha512-PkPNiElwroVyKQj01usyziOvwiKYBUVSq7YU1FB4KFr0J3v0GeXW0TebYsLR4u33WB8JGqPiAcuzDspfdujqQg==}
dependencies:
'@types/mongodb': 3.6.20
debug: 4.3.2
mongodb: 3.7.0
monk-middleware-cast-ids: 0.2.1
monk-middleware-fields: 0.2.0
monk-middleware-handle-callback: 0.2.2
monk-middleware-options: 0.2.1
monk-middleware-query: 0.2.0
monk-middleware-wait-for-connection: 0.2.0
object-assign: 4.1.1
transitivePeerDependencies:
- aws4
- bson-ext
- kerberos
- mongodb-client-encryption
- mongodb-extjson
- snappy
- supports-color
dev: false
/move-concurrently/1.0.1:
resolution: {integrity: sha1-viwAX9oy4LKa8fBdfEszIUxwH5I=}
dependencies:
@@ -8756,13 +8656,6 @@ packages:
webpack: 4.41.0
dev: false
/optional-require/1.1.7:
resolution: {integrity: sha512-cIeRZocXsZnZYn+SevbtSqNlLbeoS4mLzuNn4fvXRMDRNhTGg0sxuKXl0FnZCtnew85LorNxIbZp5OeliILhMw==}
engines: {node: '>=4'}
dependencies:
require-at: 1.0.6
dev: false
/optionator/0.9.1:
resolution: {integrity: sha512-74RlY5FCnhq4jRxVUPKDaRwrVNXMqsGsiW6AJw4XK8hmtm10wC0ypZBLw5IIp85NZMr91+qd1RvvENwg7jjRFw==}
engines: {node: '>= 0.8.0'}
@@ -9760,6 +9653,7 @@ packages:
/process-nextick-args/2.0.1:
resolution: {integrity: sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==}
dev: true
/process/0.11.10:
resolution: {integrity: sha1-czIwDoQBYb2j5podHZGn1LwW8YI=}
@@ -10264,6 +10158,7 @@ packages:
safe-buffer: 5.1.2
string_decoder: 1.1.1
util-deprecate: 1.0.2
dev: true
/readable-stream/3.6.0:
resolution: {integrity: sha512-BViHy7LKeTz4oNnkcLJ+lVSL6vpiFeX6/d3oSH8zCW7UxP2onchk+vTGB143xuFjHS3deTgkKoXXymXqymiIdA==}
@@ -10435,11 +10330,6 @@ packages:
engines: {node: '>=0.10'}
dev: true
/require-at/1.0.6:
resolution: {integrity: sha512-7i1auJbMUrXEAZCOQ0VNJgmcT2VOKPRl2YGJwgpHpC9CE91Mv4/4UYIUm4chGJaI381ZDq1JUicFii64Hapd8g==}
engines: {node: '>=4'}
dev: false
/require-directory/2.1.1:
resolution: {integrity: sha1-jGStX9MNqxyXbiNE/+f3kqam30I=}
engines: {node: '>=0.10.0'}
@@ -10629,6 +10519,7 @@ packages:
/safe-buffer/5.2.1:
resolution: {integrity: sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==}
dev: true
/safe-regex/1.1.0:
resolution: {integrity: sha1-QKNmnzsHfR6UPURinhV91IAjvy4=}
@@ -10639,14 +10530,6 @@ packages:
/safer-buffer/2.1.2:
resolution: {integrity: sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==}
/saslprep/1.0.3:
resolution: {integrity: sha512-/MY/PEMbk2SuY5sScONwhUDsV2p77Znkb/q3nSVstq/yQzYJOH/Azh29p9oJLsl3LnQwSvZDKagDGBsBwSooag==}
engines: {node: '>=6'}
dependencies:
sparse-bitfield: 3.0.3
dev: false
optional: true
/sass-loader/7.2.0_webpack@4.41.0:
resolution: {integrity: sha512-h8yUWaWtsbuIiOCgR9fd9c2lRXZ2uG+h8Dzg/AGNj+Hg/3TO8+BBAW9mEP+mh8ei+qBKqSJ0F1FLlYjNBc61OA==}
engines: {node: '>= 6.9.0'}
@@ -11023,13 +10906,6 @@ packages:
resolution: {integrity: sha512-ekwEbFp5aqSPKaqeY1PGrlGQxPNaq+Cnx4+bE2D8sciBQrHpbwoBbawqTN2+6jPs9IdWxxiUcN0K2pkczD3zmw==}
dev: false
/sparse-bitfield/3.0.3:
resolution: {integrity: sha1-/0rm5oZWBWuks+eSqzM004JzyhE=}
dependencies:
memory-pager: 1.5.0
dev: false
optional: true
/spdx-correct/3.1.1:
resolution: {integrity: sha512-cOYcUWwhCuHCXi49RhFRCyJEK3iPj1Ziz9DpViV3tbZOwXD49QzIN3MpOLJNxh2qwq2lJJZaKMVw9qNi4jTC0w==}
dependencies:
@@ -11198,6 +11074,7 @@ packages:
resolution: {integrity: sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==}
dependencies:
safe-buffer: 5.1.2
dev: true
/string_decoder/1.3.0:
resolution: {integrity: sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==}
@@ -11424,18 +11301,10 @@ packages:
strip-ansi: 6.0.0
dev: true
/tachi-common/0.5.15:
resolution: {integrity: sha512-7pBspD/7TduoJu1OdguRRxg5LyWwodhbZi5NU4y6aviJmHRetTwWXksCi4QBc72NbKlwqGwnbGrxdKFKdKQNhQ==}
/tachi-common/0.6.7:
resolution: {integrity: sha512-fdparD1htWITEz+dtEqlcdtHFoo9AZWRDX3iL052ePRGPRu0jRX5bO+V1A4cbYThMcBDefCAh3o0tBIbExyUiw==}
dependencies:
monk: 7.3.4
transitivePeerDependencies:
- aws4
- bson-ext
- kerberos
- mongodb-client-encryption
- mongodb-extjson
- snappy
- supports-color
'@types/mongodb': 3.6.18
dev: false
/tapable/1.1.3:
@@ -10,7 +10,6 @@ import Muted from "components/util/Muted";
import useApiQuery from "components/util/query/useApiQuery";
import SelectButton from "components/util/SelectButton";
import { useFormik } from "formik";
import { nanoid } from "nanoid";
import React, { useEffect, useMemo, useState } from "react";
import { Col, Form, Row } from "react-bootstrap";
import { Link, useParams } from "react-router-dom";
@@ -33,7 +32,7 @@ import { FolderDataset } from "types/tables";
import { Playtype } from "types/tachi";
import { ONE_DAY } from "util/constants/time";
import { CreateChartIDMap, CreateChartLink, CreateSongMap } from "util/data";
import { NO_OP } from "util/misc";
import { DistinctArr, NO_OP } from "util/misc";
import { NumericSOV, StrSOV } from "util/sorts";
import { GetScaleAchievedFn } from "util/tierlist";
import { FormatDate, FormatTime } from "util/time";
@@ -505,7 +504,15 @@ function TierlistInfoLadder({
.map(bucket => (
<React.Fragment key={bucket[0].data!.value}>
<Col className="ladder-header" xs={12}>
{bucket[0].data!.value} ({bucket[0].data!.text})
{bucket[0].data!.value} (
{DistinctArr(
bucket.map(e =>
gptConfig.tierlists.length === 1
? e.data.text
: `${e.key}: ${e.data.text}`
)
).join(", ")}
)
</Col>
{bucket.map((tierlistInfo, i) => (
@@ -8,7 +8,6 @@ import Icon from "components/util/Icon";
import Loading from "components/util/Loading";
import SelectButton from "components/util/SelectButton";
import deepmerge from "deepmerge";
import { nanoid } from "nanoid";
import React, { useEffect, useMemo, useState } from "react";
import { useQuery } from "react-query";
import {
@@ -7,20 +7,6 @@ export default function CHUNITHMJudgementCell({
}: {
score: ScoreDocument<"chunithm:Single"> | PBScoreDocument<"chunithm:Single">;
}) {
// even if we dont have judgement data, we know what they got.
if (score.scoreData.lamp === "ALL JUSTICE CRITICAL") {
return (
<td>
<strong>
<span style={{ color: COLOUR_SET.gold }}>0</span>-
<span style={{ color: COLOUR_SET.orange }}>0</span>-
<span style={{ color: COLOUR_SET.green }}>0</span>-
<span style={{ color: COLOUR_SET.gray }}>0</span>
</strong>
</td>
);
}
const judgements = score.scoreData.judgements;
if (
@@ -53,7 +53,7 @@ export default function DifficultyCell({
{FormatDifficultyShort(chart, game)}
</span>
{chart.levelNum.toString() !== chart.level && !chart.level.endsWith(".0") && (
<Muted>{chart.levelNum.toFixed(2)}</Muted>
<Muted>{chart.levelNum.toString()}</Muted>
)}
{"isHot" in chart.data && chart.data.isHot && (
<QuickTooltip tooltipContent="This chart is from the latest version of the game!">
@@ -7,21 +7,6 @@ export default function JubeatJudgementCell({
}: {
score: ScoreDocument<"jubeat:Single"> | PBScoreDocument<"jubeat:Single">;
}) {
// even if we dont have judgement data, we know what they got.
if (score.scoreData.lamp === "EXCELLENT") {
return (
<td>
<strong>
<span style={{ color: COLOUR_SET.pink }}>0</span>-
<span style={{ color: COLOUR_SET.gold }}>0</span>-
<span style={{ color: COLOUR_SET.blue }}>0</span>-
<span style={{ color: COLOUR_SET.purple }}>0</span>-
<span style={{ color: COLOUR_SET.red }}>0</span>
</strong>
</td>
);
}
const judgements = score.scoreData.judgements;
if (
@@ -1,4 +1,3 @@
import Muted from "components/util/Muted";
import React from "react";
import { GetGamePTConfig, PBScoreDocument, ScoreDocument } from "tachi-common";
import { ToCDNURL } from "util/api";
@@ -7,20 +7,6 @@ export default function WaccaJudgementCell({
}: {
score: ScoreDocument<"wacca:Single"> | PBScoreDocument<"wacca:Single">;
}) {
// even if we dont have judgement data, we know what they got.
if (score.scoreData.lamp === "ALL MARVELOUS") {
return (
<td>
<strong>
<span style={{ color: COLOUR_SET.vibrantPink }}>0</span>-
<span style={{ color: COLOUR_SET.gold }}>0</span>-
<span style={{ color: COLOUR_SET.blue }}>0</span>-
<span style={{ color: COLOUR_SET.red }}>0</span>
</strong>
</td>
);
}
const judgements = score.scoreData.judgements;
if (
@@ -2,7 +2,6 @@ import React from "react";
import { IDStrings, PBScoreDocument, ScoreCalculatedDataLookup, ScoreDocument } from "tachi-common";
import BMSOrPMSLampCell from "../cells/BMSOrPMSLampCell";
import DeltaCell from "../cells/DeltaCell";
import LampCell from "../cells/LampCell";
import RatingCell from "../cells/RatingCell";
import ScoreCell from "../cells/ScoreCell";
@@ -1,5 +1,4 @@
import useScoreRatingAlg from "components/util/useScoreRatingAlg";
import { nanoid } from "nanoid";
import React, { useState } from "react";
import {
ChartDocument,
@@ -13,8 +12,7 @@ import { ScoreDataset } from "types/tables";
import { Playtype } from "types/tachi";
import { NumericSOV } from "util/sorts";
import TimestampCell from "../cells/TimestampCell";
import SelectableRating from "../components/SelectableRating";
import TachiTable, { ZTableTHProps } from "../components/TachiTable";
import TachiTable from "../components/TachiTable";
import ScoreCoreCells from "../game-core-cells/ScoreCoreCells";
import { GetGPTCoreHeaders } from "../headers/GameHeaders";
@@ -1,5 +1,4 @@
import { useSessionRatingAlg } from "components/util/useScoreRatingAlg";
import { nanoid } from "nanoid";
import React, { useState } from "react";
import { Link } from "react-router-dom";
import {
@@ -12,14 +12,14 @@ import React, { useContext, useState } from "react";
import { Alert, OverlayTrigger, Tooltip } from "react-bootstrap";
import { Link } from "react-router-dom";
import {
PublicUserDocument,
ChartDocument,
FolderDocument,
FormatChart,
Game,
GetGamePTConfig,
SongDocument,
ChartDocument,
FormatChart,
FolderDocument,
PublicUserDocument,
ShowcaseStatDetails,
SongDocument,
} from "tachi-common";
import { UGPTPreferenceStatsReturn } from "types/api-returns";
import { GamePT } from "types/react";
+1 -1
View File
@@ -1,6 +1,6 @@
const MAJOR = 2;
const MINOR = 1;
const PATCH = 5;
const PATCH = 6;
// As is with all front-facing zkldi projects, the version names for tachi-client
// are from an album I like. In this case, the album is The Cure - Disintegration.
+12
View File
@@ -278,3 +278,15 @@ export function ConditionalLeadingSpace(maybeStr: string | null) {
return ` ${maybeStr}`;
}
export function DistinctArr<T>(arr: T[]): T[] {
return [...new Set(arr)];
}
export function TruncateString(string: string, len = 30) {
if (string.length < len) {
return string;
}
return `${string.slice(len - 3)}...`;
}
+2
View File
@@ -108,6 +108,8 @@ export const loggedInSplashes = [
"Let's see Paul Allen's score tracker.",
"You know there's more to shoegaze than just listening to loveless, right?",
"ok deraadt miod",
"What good are notebooks?",
"Ladies and Gentlemen We Are...",
];
// Stuff that's bad for the kids, you know?
+4 -2
View File
@@ -1,4 +1,4 @@
import { Game, GPTTierlists, IDStrings, IIDX_LAMPS, ScoreDocument } from "tachi-common";
import { Game, GPTTierlists, IDStrings, IIDX_LAMPS, ScoreDocument, SDVX_LAMPS } from "tachi-common";
import { Playtype } from "types/tachi";
type ScaleAchievedFns = {
@@ -39,7 +39,9 @@ const ScaleNameAchievedFns: ScaleAchievedFns = {
"museca:Single": {
"tachi-score": null,
},
"sdvx:Single": {},
"sdvx:Single": {
clear: k => k.scoreData.lampIndex >= SDVX_LAMPS.CLEAR,
},
"usc:Controller": {},
"usc:Keyboard": {},
"wacca:Single": {},