diff --git a/src/pages/player/index.css b/src/pages/player/index.css index 83d169a5..5ebdb1f0 100644 --- a/src/pages/player/index.css +++ b/src/pages/player/index.css @@ -51,10 +51,18 @@ ul.favorite-item-list li { color: #ffe084; } +.banned, .not-banned { + margin-left: 1em; +} + .banned { color: #cd1e2f; } +.not-banned { + color: #41cd1e; +} + .turnstile-widget { margin-top: 20px; } diff --git a/src/pages/player/index.js b/src/pages/player/index.js index 0e55e2cf..7f3495a1 100644 --- a/src/pages/player/index.js +++ b/src/pages/player/index.js @@ -14,6 +14,7 @@ import { mdiAccountSearch, mdiDownloadBox, mdiFolderOpen, + mdiGavel, } from '@mdi/js'; import { SimpleTreeView, TreeItem } from '@mui/x-tree-view'; import Tippy from '@tippyjs/react'; @@ -109,7 +110,9 @@ function Player() { const { data: items } = useItemsData(); const { data: metaData } = useMetaData(); const { data: achievements } = useAchievementsData(); - const [turnstileToken, setTurnstileToken] = useState() + const [turnstileToken, setTurnstileToken] = useState(); + const [ playerBanned, setPlayerBanned ] = useState(); + const bannedButtonRef = useRef(); const fetchProfile = useCallback(async () => { const token = turnstileRef?.current?.getResponse(); @@ -147,6 +150,32 @@ function Player() { } }, [accountId, setPlayerData, setProfileError, navigate, turnstileToken, turnstileRef, gameMode]); + const checkBanned = useCallback(async () => { + const token = turnstileRef?.current?.getResponse(); + if (!token) { + return; + } + if (!playerData?.info?.nickname) { + return; + } + try { + const searchResponse = await playerStats.searchPlayers(playerData.info.nickname, gameMode, turnstileToken); + if (turnstileRef.current?.reset) { + turnstileRef.current.reset(); + } + for (const result of searchResponse) { + if (result.name === playerData.info.nickname) { + setPlayerBanned(false); + return; + } + } + setPlayerBanned(true); + } catch (error) { + console.log(`Error checking banned status for ${playerData.info.nickname}: ${error.message}`); + } + return false; + }, [playerData, setPlayerBanned, turnstileToken, turnstileRef, gameMode]); + const downloadProfile = useCallback(() => { if (!playerData.aid) { return; @@ -206,16 +235,6 @@ function Player() { }); }, [playerData, playerLevel, t]); - const bannedMessage = useMemo(() => { - if (!playerData?.info?.bannedState) { - return false; - } - if (playerData.info.bannedUntil < 0) { - return t('Banned'); - } - return t('Banned until {{banLiftDate}}', { banLiftDate: new Date(playerData.info.bannedUntil * 1000).toLocaleString() }); - }, [playerData, t]); - const accountCategories = useMemo(() => { if (!playerData?.info?.memberCategory) { return ''; @@ -898,7 +917,24 @@ function Player() { - + )} + {playerData.aid !== 0 && !playerData.saved && ( + + {typeof playerBanned === 'undefined' && ( + + + + )} + {playerBanned === false && ( + {t('Not banned')} + )} + {playerBanned === true && ( + {t('Possibly banned')} + )} + )} {t('Warning: Profiles loaded from files may contain edited information')}

)} - {!!bannedMessage && ( -

{bannedMessage}

- )} {totalTimeInGame} {lastActiveDate} {raidsData?.length > 0 && ( diff --git a/src/pages/player/player-forward.js b/src/pages/player/player-forward.js index b1d44f66..2e623910 100644 --- a/src/pages/player/player-forward.js +++ b/src/pages/player/player-forward.js @@ -1,9 +1,18 @@ +import { useEffect } from 'react'; import { useParams, useNavigate } from 'react-router-dom'; function PlayerForward() { const params = useParams(); const navigate = useNavigate(); - navigate('/players/regular/'+params.accountId); + + useEffect(() => { + const timeout = setTimeout(() => { + navigate('/players/regular/'+params.accountId); + }, 500); + return () => { + clearTimeout(timeout); + }; + }, [params, navigate]); } export default PlayerForward;