diff --git a/src/pages/GamePage.js b/src/pages/GamePage.js index be0834b..8bfcd11 100644 --- a/src/pages/GamePage.js +++ b/src/pages/GamePage.js @@ -37,7 +37,7 @@ import { } from "../game"; import useFirebaseRef from "../hooks/useFirebaseRef"; import useKeydown, { getModifierState } from "../hooks/useKeydown"; -import { formatANoun } from "../util"; +import { formatANoun, sleep } from "../util"; import LoadingPage from "./LoadingPage"; import NotFoundPage from "./NotFoundPage"; @@ -93,6 +93,22 @@ function getNextGameId(gameId) { return `${id}-${num + 1}`; } +function ensureConnected() { + return new Promise((resolve) => { + const ref = firebase.database().ref(".info/connected"); + let wasConnected = true; + const update = (snap) => { + if (snap.val() === true) { + ref.off("value", update); + resolve(wasConnected); + } else { + wasConnected = false; + } + }; + ref.on("value", update); + }); +} + function GamePage({ match }) { const user = useContext(UserContext); const { volume, notifications } = useContext(SettingsContext); @@ -133,7 +149,7 @@ function GamePage({ match }) { if (finished.gameId === gameId) { // Attempt to finish the game a few times before giving up (async () => { - const numRetries = 8; + const numRetries = 10; for (let i = 0; i < numRetries; i++) { try { await finishGame({ gameId }); @@ -141,9 +157,8 @@ function GamePage({ match }) { } catch (error) { if (i === numRetries - 1) { setFinished({ gameId, error: error + "" }); - } else { - const delay = 100 * Math.pow(2, i); - await new Promise((resolve) => setTimeout(resolve, delay)); + } else if (await ensureConnected()) { + await sleep(100 * Math.pow(1.5, i)); } } } diff --git a/src/util.js b/src/util.js index db65ad2..54ceb35 100644 --- a/src/util.js +++ b/src/util.js @@ -36,22 +36,26 @@ function isPunctuation(charCode) { ); } -const fixedDataset = englishDataset.addPhrase((phrase) => - phrase - .setMetadata({ originalWord: "brainrot" }) - .addPattern(pattern`skibidi`) - .addPattern(pattern`|riz`) - .addPattern(pattern`gyat`) - .addPattern(pattern`sigma`) - .addPattern(pattern`xook`) - .addPattern(pattern`xoink`) - .addPattern(pattern`xiooix`) - .addPattern(pattern`admits`) - .addPattern(pattern`orz`) - .addPattern(pattern`otz`) - .addPattern(pattern`ozr`) - .addPattern(pattern`lebron`) -); +const fixedDataset = englishDataset + .addPhrase((phrase) => + phrase.setMetadata({ originalWord: "ass" }).addWhitelistedTerm("45s") + ) + .addPhrase((phrase) => + phrase + .setMetadata({ originalWord: "brainrot" }) + .addPattern(pattern`skibidi`) + .addPattern(pattern`|riz`) + .addPattern(pattern`gyat`) + .addPattern(pattern`sigma`) + .addPattern(pattern`xook`) + .addPattern(pattern`xoink`) + .addPattern(pattern`xiooix`) + .addPattern(pattern`admits`) + .addPattern(pattern`orz`) + .addPattern(pattern`otz`) + .addPattern(pattern`ozr`) + .addPattern(pattern`lebron`) + ); // Work-around for: // https://github.com/jo3-l/obscenity/issues/100 // https://github.com/jo3-l/obscenity/pull/101 @@ -165,11 +169,10 @@ export function formatDateTime(timestamp) { return d.toLocaleString(undefined, opts); } -const trimRegex = - /^[\p{White_Space}\p{Default_Ignorable_Code_Point}]+|[\p{White_Space}\p{Default_Ignorable_Code_Point}]+$/gu; +const trimRegex = /\p{Default_Ignorable_Code_Point}+/gu; export function unicodeTrim(str) { - return str.replace(trimRegex, ""); + return str.replace(trimRegex, "").trim(); } export function parseDuration(spec) { @@ -183,3 +186,7 @@ export function parseDuration(spec) { .map((v, i) => (m[i + 1] ? parseFloat(m[i + 1]) * v : 0)) .reduce((a, c) => a + c); } + +export function sleep(ms) { + return new Promise((resolve) => setTimeout(resolve, ms)); +} diff --git a/src/util.test.js b/src/util.test.js index 89b3b4e..2ca54e8 100644 --- a/src/util.test.js +++ b/src/util.test.js @@ -14,6 +14,7 @@ describe("bad words filter", () => { expect(badWords.hasMatch("fick")).toBe(false); expect(badWords.hasMatch("fickle")).toBe(false); expect(badWords.hasMatch("a\u200dsshole")).toBe(true); + expect(badWords.hasMatch("45s")).toBe(false); }); });