diff --git a/src/app/api/[region]/ratings/current/info/route.ts b/src/app/api/[region]/ratings/current/info/route.ts new file mode 100644 index 000000000..f7245897c --- /dev/null +++ b/src/app/api/[region]/ratings/current/info/route.ts @@ -0,0 +1,10 @@ +import { NextResponse } from 'next/server'; +import { Region } from '../../../../../../constants/regions'; +import getRatingsInfo from '../../../../../../core/blitz/getRatingsInfo'; + +export async function GET( + request: Request, + { params }: { params: { region: Region } }, +) { + return NextResponse.json(await getRatingsInfo(params.region)); +} diff --git a/src/app/api/[region]/ratings/current/league/[league]/route.ts b/src/app/api/[region]/ratings/current/league/[league]/route.ts new file mode 100644 index 000000000..4e2b57735 --- /dev/null +++ b/src/app/api/[region]/ratings/current/league/[league]/route.ts @@ -0,0 +1,12 @@ +import { NextResponse } from 'next/server'; +import { Region } from '../../../../../../../constants/regions'; +import { getRatingsLeague } from '../../../../../../../core/blitz/getRatingsLeague'; + +export async function GET( + request: Request, + { params }: { params: { region: Region; league: number } }, +) { + return NextResponse.json( + await getRatingsLeague(params.region, params.league), + ); +} diff --git a/src/app/api/[region]/ratings/current/neighbors/[id]/[count]/route.ts b/src/app/api/[region]/ratings/current/neighbors/[id]/[count]/route.ts new file mode 100644 index 000000000..10de3f1b1 --- /dev/null +++ b/src/app/api/[region]/ratings/current/neighbors/[id]/[count]/route.ts @@ -0,0 +1,12 @@ +import { NextResponse } from 'next/server'; +import { Region } from '../../../../../../../../constants/regions'; +import { getRatingsNeighbors } from '../../../../../../../../core/blitz/getRatingsNeighbors'; + +export async function GET( + request: Request, + { params }: { params: { region: Region; id: number; count: number } }, +) { + return NextResponse.json( + await getRatingsNeighbors(params.region, params.id, params.count), + ); +} diff --git a/src/app/api/[region]/ratings/current/search/[username]/route.ts b/src/app/api/[region]/ratings/current/search/[username]/route.ts new file mode 100644 index 000000000..0f5e51b53 --- /dev/null +++ b/src/app/api/[region]/ratings/current/search/[username]/route.ts @@ -0,0 +1,12 @@ +import { NextResponse } from 'next/server'; +import { Region } from '../../../../../../../constants/regions'; +import { searchCurrentRatingsPlayers } from '../../../../../../../core/blitz/searchCurrentRatingsPlayers'; + +export async function GET( + request: Request, + { params }: { params: { region: Region; username: string } }, +) { + return NextResponse.json( + await searchCurrentRatingsPlayers(params.region, params.username), + ); +} diff --git a/src/app/api/tank-averages/route.ts b/src/app/api/tank-averages/route.ts new file mode 100644 index 000000000..7f5ab96bf --- /dev/null +++ b/src/app/api/tank-averages/route.ts @@ -0,0 +1,6 @@ +import { NextResponse } from 'next/server'; +import { tankAverages } from '../../../core/blitzstars/tankAverages'; + +export async function GET() { + return NextResponse.json(await tankAverages); +} diff --git a/src/app/api/tankopedia/route.ts b/src/app/api/tankopedia/route.ts new file mode 100644 index 000000000..1ee08729c --- /dev/null +++ b/src/app/api/tankopedia/route.ts @@ -0,0 +1,6 @@ +import { NextResponse } from 'next/server'; +import { tankopedia } from '../../../core/blitzstars/tankopedia'; + +export async function GET() { + return NextResponse.json(await tankopedia); +} diff --git a/src/app/tools/ratings/page.tsx b/src/app/tools/ratings/page.tsx index 60267809a..a753856fb 100644 --- a/src/app/tools/ratings/page.tsx +++ b/src/app/tools/ratings/page.tsx @@ -28,7 +28,7 @@ import { getClanAccountInfo } from '../../../core/blitz/getClanAccountInfo'; import getRatingsInfo from '../../../core/blitz/getRatingsInfo'; import { getRatingsLeague } from '../../../core/blitz/getRatingsLeague'; import { getRatingsNeighbors } from '../../../core/blitz/getRatingsNeighbors'; -import regionToRegionSubdomain from '../../../core/blitz/regionToRegionSubdomain'; +import { searchCurrentRatingsPlayers } from '../../../core/blitz/searchCurrentRatingsPlayers'; import { AccountList, AccountListItem, @@ -36,7 +36,6 @@ import { import { getArchivedLatestSeasonNumber } from '../../../core/blitzkrieg/getArchivedLatestSeasonNumber'; import getArchivedRatingsInfo from '../../../core/blitzkrieg/getArchivedRatingsInfo'; import { getArchivedRatingsLeaderboard } from '../../../core/blitzkrieg/getArchivedRatingsLeaderboard'; -import { withCORSProxy } from '../../../core/blitzkrieg/withCORSProxy'; import { PageTurner } from './components/PageTurner'; const ROWS_OPTIONS = [5, 10, 15, 25, 30]; @@ -621,35 +620,11 @@ export default function Page() { if (season === 0) { setSearchLoading(true); - const response = await fetch( - withCORSProxy( - `https://${regionToRegionSubdomain( - region, - )}.wotblitz.com/en/api/rating-leaderboards/search/?prefix=${encodedSearch}`, - ), - ); const accountList = - (await response.json()) as Record< - number, - { - spa_id: number; - nickname: string; - clan_tag: string; - } & ( - | { - skip: true; - } - | { - skip: false; - mmr: number; - season_number: number; - calibrationBattlesLeft: number; - number: number; - updated_at: string; - neighbors: []; - } - ) - >; + await searchCurrentRatingsPlayers( + region, + trimmedSearch, + ); const values = Object.values(accountList).filter( (searchedPlayer) => !searchedPlayer.skip, ); diff --git a/src/core/blitz/getRatingsInfo.ts b/src/core/blitz/getRatingsInfo.ts index 7980f3cbf..ec914d043 100644 --- a/src/core/blitz/getRatingsInfo.ts +++ b/src/core/blitz/getRatingsInfo.ts @@ -1,15 +1,15 @@ import { RatingsInfo } from '../../commands/ratings'; import { Region } from '../../constants/regions'; -import { withCORSProxy } from '../blitzkrieg/withCORSProxy'; +import { context } from '../blitzkrieg/context'; import regionToRegionSubdomain from './regionToRegionSubdomain'; export default async function getRatingsInfo(region: Region) { const response = await fetch( - withCORSProxy( - `https://${regionToRegionSubdomain( - region, - )}.wotblitz.com/en/api/rating-leaderboards/season/`, - ), + context === 'website' + ? `/api/${region}/ratings/current/info` + : `https://${regionToRegionSubdomain( + region, + )}.wotblitz.com/en/api/rating-leaderboards/season/`, ); return (await response.json()) as Promise; diff --git a/src/core/blitz/getRatingsLeague.ts b/src/core/blitz/getRatingsLeague.ts index 29ea7be9e..49445335e 100644 --- a/src/core/blitz/getRatingsLeague.ts +++ b/src/core/blitz/getRatingsLeague.ts @@ -1,7 +1,7 @@ import { LeagueTop } from '../../commands/ratings'; import { Region } from '../../constants/regions'; +import { context } from '../blitzkrieg/context'; import { patientFetch } from '../blitzkrieg/patientFetch'; -import { withCORSProxy } from '../blitzkrieg/withCORSProxy'; import regionToRegionSubdomain from './regionToRegionSubdomain'; export async function getRatingsLeague( @@ -11,11 +11,11 @@ export async function getRatingsLeague( ) { const fetcher = usePatientFetcher ? patientFetch : fetch; const response = await fetcher( - withCORSProxy( - `https://${regionToRegionSubdomain( - region, - )}.wotblitz.com/en/api/rating-leaderboards/league/${league}/top/`, - ), + context === 'website' + ? `/api/${region}/ratings/current/league/${league}` + : `https://${regionToRegionSubdomain( + region, + )}.wotblitz.com/en/api/rating-leaderboards/league/${league}/top/`, ); const json = (await response.json()) as LeagueTop; diff --git a/src/core/blitz/getRatingsNeighbors.ts b/src/core/blitz/getRatingsNeighbors.ts index 407627e54..b7320b104 100644 --- a/src/core/blitz/getRatingsNeighbors.ts +++ b/src/core/blitz/getRatingsNeighbors.ts @@ -1,22 +1,22 @@ import { RatingsNeighbors } from '../../commands/ratings'; import { Region } from '../../constants/regions'; +import { context } from '../blitzkrieg/context'; import { patientFetch } from '../blitzkrieg/patientFetch'; -import { withCORSProxy } from '../blitzkrieg/withCORSProxy'; import regionToRegionSubdomain from './regionToRegionSubdomain'; export async function getRatingsNeighbors( region: Region, id: number, - count = 30, + count: number, usePatientFetcher = false, ) { const fetcher = usePatientFetcher ? patientFetch : fetch; const response = await fetcher( - withCORSProxy( - `https://${regionToRegionSubdomain( - region, - )}.wotblitz.com/en/api/rating-leaderboards/user/${id}/?neighbors=${count}`, - ), + context === 'website' + ? `/api/${region}/ratings/current/neighbors/${id}/${count}` + : `https://${regionToRegionSubdomain( + region, + )}.wotblitz.com/en/api/rating-leaderboards/user/${id}/?neighbors=${count}`, ); const json = (await response.json()) as RatingsNeighbors; diff --git a/src/core/blitz/searchCurrentRatingsPlayers.ts b/src/core/blitz/searchCurrentRatingsPlayers.ts new file mode 100644 index 000000000..259618cb8 --- /dev/null +++ b/src/core/blitz/searchCurrentRatingsPlayers.ts @@ -0,0 +1,42 @@ +import { Region } from '../../constants/regions'; +import { context } from '../blitzkrieg/context'; +import regionToRegionSubdomain from './regionToRegionSubdomain'; + +type CurrentRatingsPlayerSearch = Record< + number, + { + spa_id: number; + nickname: string; + clan_tag: string; + } & ( + | { + skip: true; + } + | { + skip: false; + mmr: number; + season_number: number; + calibrationBattlesLeft: number; + number: number; + updated_at: string; + neighbors: []; + } + ) +>; + +export async function searchCurrentRatingsPlayers( + region: Region, + name: string, +) { + const encodedSearch = encodeURIComponent(name); + const response = await fetch( + context === 'website' + ? `/api/${region}/ratings/current/search/${encodedSearch}` + : `https://${regionToRegionSubdomain( + region, + )}.wotblitz.com/en/api/rating-leaderboards/search/?prefix=${encodedSearch}`, + ); + const accountList = (await response.json()) as CurrentRatingsPlayerSearch; + + return accountList; +} diff --git a/src/core/blitzkrieg/withCORSProxy.ts b/src/core/blitzkrieg/withCORSProxy.ts deleted file mode 100644 index cce2d45ad..000000000 --- a/src/core/blitzkrieg/withCORSProxy.ts +++ /dev/null @@ -1,7 +0,0 @@ -import { context } from './context'; - -export function withCORSProxy(url: string) { - return context === 'website' - ? `https://corsproxy.io/?${encodeURIComponent(url)}` - : url; -} diff --git a/src/core/blitzstars/tankAverages.ts b/src/core/blitzstars/tankAverages.ts index a2d1bf8ae..6316d7db9 100644 --- a/src/core/blitzstars/tankAverages.ts +++ b/src/core/blitzstars/tankAverages.ts @@ -1,6 +1,5 @@ import { AllStats } from '../blitz/getAccountInfo'; import { context } from '../blitzkrieg/context'; -import { withCORSProxy } from '../blitzkrieg/withCORSProxy'; import { tankopedia } from './tankopedia'; export interface SpecialStats { @@ -86,7 +85,9 @@ tankopedia; export type TankAverages = Record; export const tankAverages = fetch( - withCORSProxy('https://www.blitzstars.com/api/tankaverages.json'), + context === 'website' + ? '/api/tank-averages' + : 'https://www.blitzstars.com/api/tankaverages.json', ) .then((response) => response.json()) .then((json) => { diff --git a/src/core/blitzstars/tankopedia.ts b/src/core/blitzstars/tankopedia.ts index 3d12d61cb..faf794f6c 100644 --- a/src/core/blitzstars/tankopedia.ts +++ b/src/core/blitzstars/tankopedia.ts @@ -1,6 +1,5 @@ import { deburr } from 'lodash'; import { context } from '../blitzkrieg/context'; -import { withCORSProxy } from '../blitzkrieg/withCORSProxy'; export interface TankopediaEntry { name: string; @@ -19,7 +18,9 @@ export interface Tankopedia { } export const tankopedia = fetch( - withCORSProxy('https://www.blitzstars.com/bs-tankopedia.json'), + context === 'website' + ? '/api/tankopedia' + : 'https://www.blitzstars.com/bs-tankopedia.json', ) .then(async (response) => response.json()) .then((wrapperTankopedia) =>